객체지향언어의 주요 특징
- 코드의 재사용성이 높다.
- 코드의 관리가 용이하다.
- 신뢰성이 높은 프로그래밍을 가능하게 한다.
- 제어자와 메서드를 이용해서 데이터를 보호하고 올바른 값을 유지하도록 하며, 코드의 중복을 제거하여 코드의 불일치로 인한 오동작을 방지한다.
클래스와 객체
클래스의 정의: 클래스란 객체를 정의해 놓은 것
클래스의 용도: 객체를 생성하는데 사용
객체의 정의: 실제로 존재하는 것. 사물 또는 개념
객체의 용도: 객체가 가지고 있는 기능과 속성에 따라 다름
유형의 객체: 책상, 의자, 자동차 등과 같은 사물
무형의 객체: 수학공식, 프로그램 에러와 같은 논리와 개념
프로그래밍에서의 객체 : 클래스에 정의된 내용대로 메모리에 생성된 것을 뜻함.
클래스를 정의하고 클래스를 통해 객체를 생성하는 이유는 설계도를 통해서 제품을 만드는 이유와 같다.
하나의 설계도만 잘 만들어 놓으면 제품을 만드는 일이 쉬워진다.
이와 마찬가지로 클래스를 잘 만들어 놓기만 하면, 매번 객체를 생성할 때마다 어떻게 객체를 만들어야 할지를 고민하지 않아도 된다. 그냥 클래스로부터 객체를 생성해서 사용하기만 하면 되는 것이다.
JDK(Java Development Kit)에서는 프로그래밍을 위해 많은 수의 유용한 클래스(Java API)를 기본적으로 제공하고 있으며, 우리는 이 클래스들을 이용해서 원하는 기능의 프로그램을 보다 쉽게 작성할 수 있다.
객체와 인스턴스
클래스로부터 객체를 만드는 과정을 클래스의 인스턴스화(instantiate)라고 하며,
클래스로부터 만들어진 객체를 그 클래스의 인스턴스(instance)라고 한다.
결국 인스턴스는 객체와 같은 의미지만, 객체는 모든 인스턴스를 대표하는 포괄적인 의미를 갖고 있고,
인스턴스는 어떤 클래스로부터 만들어진 것인지를 강조하는 것보다 구체적인 의미를 가지고 있다.
객체의 구성요소(속성 & 기능)
객체는 속성과 기능, 두 종류의 구성요소로 이루어져 있으며, 객체가 가지고 있는 속성과 기능을 그 객체의 멤버라고 한다.
속성과 기능은 아래와 같이 같은 뜻의 여러가지 용어가 있으며, 이 중에서 '속성'보다 '멤버변수', '기능'보다는 '메서드를 주로 사용할 것.
속성(property), 멤버변수(member variable), 특성(attribute), 필드(field), 상태(stage)
기능(function), 메서드(method), 함수(function), 행위(behavior)
객체지향 프로그래밍에선 속성과 기능을 각각 변수와 메서드로 표현한다.
예시) TV 클래스
속성 | 크기,길이,높이,색상,볼륨,채널 등 |
기능 | 켜기,끄기,볼륨 높이기, 볼륨 낮추기, 채널 변경하기 등 |
Class Tv{
// 멤버변수
String color;
boolean power;
int channel;
//메서드
void power();
void channelUp();
void channelDown();
}
인스턴스의 생성과 사용
클래스명 변수명; // 클래스의 객체를 참조하기 위한 참조변수를 선언
변수명 = new 클래스명(); // 클래스의 객체를 생성 후, 객체의 주소를 참조변수에 저장
Tv t;
t = new Tv();
class Tv {
// Tv의 속성(멤버변수)
String color; // 색상
boolean power; // 전원상태(on/off)
int channel; // 채널
// Tv의 기능(메서드)
void power() { power = !power; } // TV를 켜거나 끄는 기능을 하는 메서드
void channelUp() { ++channel; } // TV의 채널을 높이는 기능을 하는 메서드
void channelDown() { --channel; } // TV의 채널을 낮추는 기능을 하는 메서드
}
class TvTest {
public static void main(String args[]) {
Tv t; // Tv인스턴스를 참조하기 위한 변수 t를 선언
t = new Tv(); // Tv인스턴스를 생성한다.
t.channel = 7; // Tv인스턴스의 멤버변수 channel의 값을 7로 한다.
t.channelDown(); // Tv인스턴스의 메서드 channelDown()을 호출한다.
System.out.println("현재 채널은 " + t.channel + " 입니다.");
}
}
- Tv t;
- 메모리에 참조변수 t를 위한 공간 마련
- t = new Tv();
- 연산자 new에 의해 Tv클래스의 인스턴스가 메모리의 빈 공간에 생성
- 각 멤버변수는 기본값으로 초기화
- 참조형의 경우 null
- t 에 객체의 주소값 저장
인스턴스는 차몾변수를 통해서만 다룰 수 있으며, 참조변수의 타입은 인스턴스의 타입과 일치
Tv t1 = new Tv();
Tv t2 = new Tv();
t2= t1;
t2 = t1;
t1은 참조변수이므로, 인스턴스의 주소의 값을 저장하고 있다.
위의 문장을 통해 t2에도 t1의 저장되어 있던 주소의 값이 저장되게 된다.
그로 인해 t2가 가지고 있던 인스턴스는 더 이상 사용할 수 없고, t1이 가지고 있던 인스턴스를 같이 참조한다.
자신을 참조하고 있는 참조변수가 하나도 없는 인스턴스는 '가비지 컬렉터'에 의해 자동적으로 메모리에서 제거된다.
객체 배열
말 그대로 객체로 배열을 이룬 것이다.
객체 배열 안에는 객체가 저장되는 것이 아니라, 객체의 주소가 저장된다.
참조변수들을 하나로 묶은 참조 변수 배열이라고 생각하면 된다.
Tv[] tvArr = new Tv[3]; // 객체 배열 생성, 각 배열의 요소는 참조변수의 초기값 null로 되어있음.
// 객체를 생성하여 배열의 각 요소에 저장
tvArr[0] = new Tv();
tvArr[1] = new Tv();
tvArr[2] = new Tv();
클래스의 또 다른 정의
클래스 - 데이터와 함수의 결합
프로그래밍언어에서 데이터 처리를 위한 데이터 저장형태의 발전과정은 다음과 같다.
1. 변수 : 하나의 데이터를 저장할 수 있는 공간
2. 배열 : 같은 종류의 여러 데이터를 하나의 집합으로 저장할 수 있는 공간
3. 구조체 : 서로 관련된 여러 데이터를 종류에 관계없이 하나의 집합으로 저장할 수 있는 공간
4. 클래스 : 데이터와 함수의 결합(구조체 + 함수)
서로 관련된 변수들을 정의하고 이들에 대한 작업을 수행하는 함수들을 함께 정의한 것이 클래스이다.
C언어에선 문자열을 문자의 배열로 다루지만, 자바에서는 String이란 클래스로 문자열을 다룬다.
문자열을 단순히 문자의 배열로 정의하지않고 문자열과 문자열을 다루는 필요한 함수들을 함께 묶기 위해서이다.
참조
'Java의 정석' 책
'Language > Java' 카테고리의 다른 글
[Java] 오버로딩(overloading) (0) | 2022.03.02 |
---|---|
[Java] 변수와 메서드 (0) | 2022.03.02 |
[Java] 배열(Array) (0) | 2022.03.01 |
[Java] 연산자(Operator) (0) | 2022.02.28 |
[Java] 형변환(casting) (0) | 2022.02.28 |
댓글