1. 클래스와 객체의 정의와 용도
클래스란 '객체를 정의해놓은 것', 또는 '객체의 설계도, 틀' 이라고 정의할 수 있다. 클래스는 객체를 생성하는데사용하며, 객체는 클래스에 정의된 대로 생성된다.
클래스의 정의 - 클래스란 객체를 정의해 놓은 것이다.
클래스의 용도 - 클래스는 객체를 생성하는데 사용된다.
객체는 '실제로 존재하는 것'으로 우리 주변의 사물들을 생각하면 된다. 객체지향이론에서는 사물과 같은 유형의것들 뿐 아니라 개념이나 논리와 같은 무형적인 것들도 객체로 간주한다.
프로그래밍에서는 클래스에 정의된 내용대로 메모리에 생성된 것을 뜻한다.
객체의 정의 - 실제로 존재하는 것. 사물 또는 개념
객체의 용도 - 객체가 가지고 있는 기능과 속성에 따라 다름
클래스와 객체의 관계는 설계도와 실제 제품의 관계로 생각하면 된다. 클래스는 단지 객체를 생성하는데 사용될뿐 객체 그 자체는 아니다. 우리가 원하는 기능을 설계하여 클래스로 만들어 둔 다음 해당 클래스로부터 객체를생성하여 기능을 사용한다.
하나의 설계도를 만들어두면 이를 통해서 똑같은 제품들을 여럿 만들어낼 수 있듯이, 하나의 클래스를 만들어두면 이로부터 필요할 때마다 객체를 생성하여 사용할 수 있다.
2. 객체와 인스턴스
클래스로부터 객체를 생성하는 과정을 클래스의 인스턴스화라고 하며, 어떤 클래스로부터 만들어진 객체를 인스턴스 (instance)라고 한다.
인스턴스와 객체는 같은 의미이지만, 객체는 인스턴스들을 대표하는 포괄적인 의미인 반면 인스턴스는 클래스로부터 생성된 각각의 객체를 의미하는 말로 어떤 클래스로부터 만들어졌는지를 보다 강조한다.
클래스 -- (인스턴스화) --> 인스턴스 (객체)
3. 객체의 구성요소 - 속성과 기능
객체는 속성과 기능, 두 종류의 구성요소로 이루어져 있으며 일반적으로 객체는 다수의 속성과 다수의 기능을가진다. 이러한 속성과 기능은 객체의 멤버 (member)라고 한다.
클래스란 객체를 정의한 것이므로 클래스에는 객체의 모든 속성과 기능이 정의되어있다. 해당 클래스로부터 객체를 생성하면 정의된 속성과 기능을 가진 객체가 만들어진다.
속성과 기능은 다음과 같이 여러 용어로 표현되며, 그중에서도 멤버변수와 메서드를 많이 사용한다.
속성 (property) - member variable, attribute, field, state
기능 (function) - method, function, behavior
실제 프로그래밍에서 속성은 변수로 기능은 메서드 (함수)로 구현한다.
예시로 TV를 간단하게 클래스로 프로그래밍해보면 다음과 같다.
class Tv {
String color; // 색깔
boolean power; // 전원상태
int channel; // 채널
void power() {power = !power;}
void channelUp() {channel++;}
void channelDown() {channel--;}
}
4. 인스턴스의 생성과 사용
- 인스턴스의 생성
클래스로 선언한 내용을 실제 객체로 사용하기 위해서는 인스턴스를 생성해야 한다. 인스턴스를 생성하는 방법은 여러가지가 있는데 일반적으로 다음과 같은 방법으로 생성한다.
ClassName VarName; // 클래스의 객체를 참조하기 위한 참조변수 선언
VarName = new ClassName(); // 클래스의 객체를 생성한 후, 객체의 주소를 참조변수에 저장
// Tv 예시
Tv tv; // Tv 클래스 타입의 참조변수 tv 선언
tv = new Tv(); // Tv 인스턴스 생성한 후 주소를 tv에 저장
- 인스턴스의 사용
인스턴스를 생성하고, 해당 인스턴스의 속성과 메서드를 사용하는 예시를 위의 Tv 클래스를 사용하여 단계적으로 살펴보자.
class TvTest {
public static void main(String args[]) {
Tv tv;
tv = new Tv();
tv.channel = 5;
tv.channelDown();
System.out.println("현재 채널: " + tv.channel);
}
}
'''
1. Tv tv;
- Tv 클래스 타입의 참조변수 tv를 선언한다.
- 참조변수 tv를 위한 공간이 마련되지만 아직 인스턴스가 생성되지 않아 아무 기능도 할 수 없다.
2. tv = new Tv();
- 연산자 new에 의해 Tv 클래스의 인스턴스가 생성되어 메모리를 할당받는다.
- 이떄 각 멤버변수는 자료형에 해당하는 기본값으로 초기화된다.
- 생성된 객체의 메모리 주소값이 참조변수 tv에 저장되어 변수 tv를 통해서 해당 인스턴스에 접근할 수 있게 된다.
3. tv.channel = 5;
- 참조변수 tv를 통해 해당 주소의 인스턴스에 접근하여 멤버변수 channel에 5라는 값을 저장한다.
- 이와 같이 객체의 내부 속성과 기능에 접근하기 위해서는 '.' 기호를 사용하면 된다.
4. t.channelDown();
- 해당 인스턴스의 멤버변수인 channel의 값이 1 감소하여 4가 된다.
5. System.out.println("현재 채널: " + tv.channel);
- 참조변수 tv의 멤버변수인 channel의 값인 4가 출력되어 "현재 채널: 4" 가 출력된다.
'''
5. 객체 배열
많은 수의 객체를 다루기 위해서는 배열로 만들어서 관리하는 것이 편하다. 객체 역시 배열로 만드는 것이 가능하며, 이를 '객체 배열' 이라고 한다.
Tv[] tvArr = new Tv[3]; // 길이가 3인 Tv 타입의 참조변수 배열
// 배열의 각 요소에 인스턴스를 생성해주어 초기화한다.
tvArr[0] = new Tv();
tvArr[1] = new Tv();
tvArr[2] = new Tv();
위의 코드를 수행하는 경우 Tv 타입의 객체를 담을 수 있는 크기 3의 배열이 만들어진다. 배열의 각 요소는 참조변수들로 생성된 직후에는 null로 아무 값도 들어있지 않다. new Tv() 를 통해서 인스턴스를 생성하고 이를 참조변수에 저장해주어야지 각 요소들을 Tv 객체로 사용할 수 있다.
6. 클래스의 또 다른 정의
프로그래밍적인 관점에서의 클래스의 정의와 의미
- 클래스 - 데이터와 함수의 결합
프로그래밍 언어에서 데이터 처리를 위한 데이터 저장 형태의 발전 과정은 다음과 같다.
1) 변수: 하나의 데이터를 저장할 수 있는 공간
2) 배열: 같은 종류의 여러 데이터를 하나의 집합으로 저장할 수 있는 공간
3) 구조체: 서로 관련된 여러 데이터를 종류에 관계없이 하나의 집합으로 저장할 수 있는 공간
4) 클래스: 데이터와 함수의 결합 (구조체 + 함수)
- 클래스 - 사용자 정의 타입 (user-defined type)
프로그래밍 언어에서 기본으로 제공하는 기본형 외에 프로그래머가 직접 구현하여 하나의 타입으로 새로 추가하는 것을 사용자 정의 타입, user-defined type이라고 한다.
자바와 같은 객체지향언어에서는 클래스가 곧 사용자 정의 타입이다.
'프로그래밍언어 > JAVA' 카테고리의 다른 글
[JAVA] 오버로딩 (Overloading) (0) | 2021.09.01 |
---|---|
[JAVA] 변수와 메서드 (0) | 2021.08.31 |
[JAVA] 다차원 배열 (0) | 2021.08.25 |
[JAVA] String 배열 (0) | 2021.08.24 |
[JAVA] 배열 (Array) (0) | 2021.08.24 |