프로그래밍/JAVA

[ JAVA ] 클래스와 객체

리신 2022. 9. 15. 21:23
반응형

1. 클래스와 객체의 정의와 용도

클래스란?

'객체를 정의해놓은 것' 또는 '객체의 설계도 또는 틀' 이라고 정의할 수 있다.

 

클래스는 객체를 생성하는데 사용되며, 객체는 클래스에 정의된 대로 생성된다.

클래스의 정의  클래스란 객체를 정의해 놓은 것이다.
클래스의 용도  클래스는 객체를 생성하는데 사용된다.

객체는 사전적인 정의로는 '실제 존재하는 것' 이다.

객체지향 이론에서는 사물과 같은 유형적인 것 뿐만 아니라, 개념이나 논리와 같은 무형적인 것들도 객체로 간주한다.

* 프로그래밍에서 객체는 클래스에 정의된 내용대로 메모리에 생성된 것을 뜻한다.

객체의 정의 실제로 존재하는 것. 사물 또는 개념
객체의 용도 객체가 가지고 있는 기능과 속성에 따라 다름

유형의 객체 책상,의자,자동차,TV와 같은 사물
무형의 객체 수학공식, 프로그램 에러와 같은 논리나 개념

클래스와 객체의 예시)

클래스 객체
제품 설계도 제품
TV 설계도 TV
붕어빵 기계 붕어빵

 

클래스를 정의하고 객체를 생성하는 이유는?

설계도를 통해서 제품을 만드는 이유와 같다.

하나의 설계도만 잘 만들어 놓으면 제품을 만드는 일이 쉬워진다.

 

이와 마찬가지로 클래스를 한번만 잘 만들어 놓기만 하면,

매번 객체를 생성할 때마다 어떻게 만들어야할지 고민하지 않고

만들어 둔 해당 클래스로부터 객체를 생성해서 사용하기만 하면 되는 것이다.

 

 

2.객체와 인스턴스

클래스 → 인스터스화 → 인스턴스(객체)

클래스로부터 객체를 만드는 과정을 클래스의 인스턴스화(instantiate)라고 하며,
어떤 클래스로 만들어진 객체를 그 클래스의 인스턴스(instance)라고 한다.

 

3.객체의 구성요소 -속성과 기능

객체의 구성요소로는 속성과 기능이 있다.

일반적으로는 객체는 다수의 속성과 다수의 기능을 갖는다.

그리고 객체가 가지고 있는 속성과 기능을 그 객체의 멤버(구성원,member)라 한다.

 

클래스에는 객체의 모든 속성과 기능이 정의되어있다.

클래스로부터 객체를 생성하면, 클래스에 정의된 속성과 기능을 가진 객체가 만들어진다.

 

 속성과 기능은 아래와 같이 같은 뜻의 여러 가지 용어가 있다.

속성 (property)   :  멤버변수(memebr variable), 특성(attribute), 필드(field), 상태(state)
기능 (function)    :  메서드(method), 함수(fuction), 행위(behavior)

 

예를들어)

TV로 예를 들어보자.

TV의 속성 TV의 기능
- 전원상태
- 크기
- 길이
- 높이
- 색상
- 켜기
- 끄기
- 볼륨 높이기
- 볼륨 낮추기
- 채널 변경

위 내용을 토대로 TV클래스를 만들어보면 아래와 같이 클래스를 만들수 있다.

class TV {
	Sring color;   // 색상
    boolean power; // 전원상태
    int channel;   // 채널
    
    void power(){ power = !power;}
    void channelUp(){ channel++;}
    void channelDown(){ channel--;}
}

* 프로그래밍에 필요한 속성과 기능을 선택하여 클래스를 작성하면 된다.

 

 

4. 인스턴스의 생성과 사용

TV 클래스를 선언한 것은 TV설계도를 작성한 것에 불과하므로, TV인스턴스를 생성해야 제품(TV)을 사용할 수 있다.

 

클래스로부터 인스턴스를 생성하는 방법

클래스명 변수명;  // 클래스의 객체를 참조하기 위한 참조변수를 선언
변수명 = new 클래스명(); // 클래스의 객체를 생성 후, 객체의 주소를 참조변수에 저장

TV t;  // TV클래스 타입의 참조변수 t선언
t = new Tv()  // TV인스턴스를 생성한 후, 생성된 TV인스턴스의 주소를 t에 저장

// 선언과 초기화를 같이할 경우
TV t = new TV();

 

TV클래스로부터 인스턴스를 생성하고 인스턴스의 속성과 메소드 사용하는 방법을 알아보자!!

class TV {
	Sring color;   // 색상
    boolean power; // 전원상태
    int channel;   // 채널
    
    void power(){ power = !power;}
    void channelUp(){ ++channel;}
    void channelDown(){ --channel;}
}

class TVTest{
	public static void main(String args[]){
        TV t;  // TV클래스 타입의 참조변수 t선언
        t = new Tv()  // TV인스턴스를 생성한 후, 생성된 TV인스턴스의 주소를 t에 저장
        t.channel = 7;  // TV인스턴스의 멤버변수 channel의 값을 7로 한다.
        t.channelDown();  // TV인스턴스의 메서드 channelDown()을 호출한다.
        System.out.println("현재 채널은 " + t.channel + "입니다.");
    }
}

위 예제 코드를보고 단계별로 자세히 살펴보자!

 

1. TV   t;

메모리에 t의 공간 생성

TV 클래스 타입의 참조변수  t를 선언한다.

메모리에 참조변수 t를 위한 공간이 마련된다.

아직 인스턴스가 생성되지 않았으므로 참조변수로 아무것도 할 수 없다.

 

 

2. t = new TV();

(1) 연산자 new에 의해 TV클래스의 인스턴스가 메모리의 빈 공간에 생성된다.

      주소가 0x100인 곳에 생성되었다고 가정하자.

      (이 때, 멤버변수는 각 자료형에 해당하는 기본값으로 초기화 된다.)

 

(2) 내용의 그림

(2)  대입연산자(=)에 의해서 생성된 객체의 주소값이 참조변수 t에 저장된다.

이제는 참조변수 t를 통해 TV인스턴스에 접근 할 수 있다.

 

3. t.channel = 7;

channel에 7이 저장

참조변수 t에 저장된 주소에 있는 인스턴스의 멤버변수 channel 에 7을 저장한다.

인스턴스의 멤버변수(속성)를 사용하려면 '참조변수.멤버변수'와 같이 사용하면 된다.

 

4. t.channelDown();

참조변수 t가 참조하고 있는  TV인스턴스의 channelDown메서드를 호출한다.

channelDown메서드는 멤버변수 channel에 저장되어 있는 값을 1 감소시킨다.

channelDown()에 의해서 channel의 값은 7에서 6이 된다.

 

5. System.out.println("현재 채널은 " + t.channel + "입니다.");

참조변수 t가 참조하고 있는 TV인스턴스의 멤버변수 channel에 저장되어 있는 값을 출력한다.

현재 channel의 값은 6이므로 '현재 채널은 6 입니다.'가 출력된다.

 

 

5. 객체 배열

수 많은 객체를 다뤄야할 때, 객체도 배열로 다루는 것이 가능하다.

객체 배열은 배열 안에 객체가 저장되는 것은 아니고, 객체의 주소가 저장된다.
사실 객체 배열은 참조변수들을 하나로 묶은 참조변수 배열인 것이다.

 

만약 길이가 3인 객체 배열 tvArr을 아래와 같이 생성하면, 각 요소는 참조변수의 기본값인 null로 자동 초기화 된다.

* 이 객체 배열은 3개의 객체의 주소 값을 저장 할 수 있다.

 

TV[] tvArr = new TV[3]; // 길이가 3인 TV타입의 참조변수 배열

// [방법 1] 객체를 생성해서 배열의 각 요소에 저장 
tvArr[0] = new TV();
tvArr[2] = new TV();
tvArr[3] = new TV();

// [방법 2] 배열의 초기화 방법 사용 
TV[] tvArr = {new TV(), new TV(), new TV()};

// [방법 3] 객체의 수가 많을 때는 for문 사용
for(int i = 0; i < tvArr.length; i++){
	tvArr[i] = new TV();
}

 * 객체 배열도 같은 타입의 객체만 저장할 수 있다.

하지만 여러종류의 객체를 하나의 배열에 저장할 수 있는 방법이 있다!  (hint 다형성)

다음 시간에 알아보도록 하자!!

 

 

6. 클래스의 또 다른 정의

프로그래밍적인 관점에서 클래스의 정의와 의미를 살펴보자!!

 

1. 클래스 - 데이터와 함수의 결합

프로그래밍언어에서 데이터 처리를 위한 데이터 저장형태의 발전과정은 아래와 같다.

 

데이터 저장개념의 발전과정

변수  → 배열  → 구조체  → 클래스

1. 변수       하나의 데이터를 저장할 수 있는 공간
2. 배열       같은 종류의 여러 데이터를 하나의 집합으로 저장할 수 있는 공간
3. 구조체   서로 관련된 여러 데이터를 종류에 관계없이 하나의 집합으로 저장할 수 있는 공간
4. 클래스   데이터와 함수의 결험(구조체 + 함수)

 

2. 클래스 - 사용자정의 타입(user - defined type)

 

프로그래밍언어에서 제공하는 자료형외에 프로그래머가 서로 관련된 변수들을 묶어서 하나의 타입으로 새로 추가하는 것을 사용자정의 타입이라고 한다.

 

비객체지향적 코드와 객체지향적 코드의 비교

비객체지향적 코드 객체지향적 코드
int     hour1, hour2, hour3;
int     minute1, minute2, minute3;
float  second1, second2, second3;
Time   t1  =  new  Time();
Time   t2  =  new  Time();
Time   t3  =  new  Time();
int []  hour = new int[3];
int [] minute = new int[3];
int [] second = new int[3];
Time   [] t = new Time[3];
t[0] = new  Time();
t[1] = new  Time();
t[2] = new  Time();

 

* 참고 자료 JAVA의 정석

반응형