본문 바로가기

자바

[JAVA] 클래스와 객체

클래스

 

클래스 : 객체를 정의해 놓은 것

클래스의 용도 : 객체를 생성하는데 사용

 

객체 : 실제로 존재하는 것, 사물

객체의 용도 : 객체가 가지고 있는 기능과 속성에 따라 다름

 

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

 

예를 들면 TV 설계도(클래스)는 TV 라는 제품(객체)을 정의한 것이고 TV(객체)를 만드는데 사용된다.

클래스는 단지 객체를 생성하는데 사용될 뿐, 객체 그 자체는 아니다.

 


 

객체와 인스턴스

 

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

 

예를 들어, TV 클래스로부터 만들어진 객체를 TV 클래스의 인스턴스라고 한다.

인스턴스와 객체는 같은 의미지만 객체는 모든 인스턴스를 대표하는 포괄적인 의미를 갖고있고, 인스턴스는 어떤 클래스로부터 만들어진 것인지를 강조하는 보다 구체적인 의미를 갖고있다.

 

tv는 객체다, tv는 tv 클래스의 인스턴스이다. 라고 하는것이 자연스럽다

 

객체는 속성과 기능 두 종류의 구성요소로 이루어져 있으며, 일반적으로는 객체는 다수의 속성과 다수의 기능을 갖는다.

즉, 객체는 속성과 기능의 집합이다.

 

클래스란 객체를 정의한 것으로 클래스에는 객체의 모든 속성와 기능이 정의되어있다.

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

 

속성(property) : 멤버변수, 특성, 필드, 상태

기능(function) : 메서드, 함수, 행위

 

tv로 예를 들면 속성으로는 전원상태, 크기, 길이, 볼륨, 채널 등이 있고

기능은 켜기, 끄기, 볼륨 바꾸기, 채널 변경 등이 있다.

 

tv 클래스를 생성한 코드

class Tv {

	String color;
    boolean power;
    int channel;
    
    void power() { power = !power }
    void channelUp(); { channel++; }
    voidChannelDonw() { channel--; }
    
 }

 

 

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

 

tv 인스턴스 생성 코드

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

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

 

tv 클래스

public class Thisisjava {
    public static void main(String[] args) {
        Tv t = new Tv();
        t.channel = 7;
        t.channelDown();
        t.color = "black";

        System.out.println("현재 채널은 : " + t.channel + " " + "현재 색상은 : " + t.color);
    }
}

class Tv {
    // tv 속성 (멤버변수)
    String color;
    boolean power;
    int channel;

    void power() {
        power = !power;
    }

    void channelUp() {
        ++channel;
    }

    void channelDown() {
        --channel;
    }
}

 

1. Tv t :

   Tv 클래스 타입의 참조변수 t를 선언하여 메모리에 참조변수 t를 위한 공간이 마련된다.

2. t = new Tv(); 

연산자 new 에 의해 Tv 클래스의 인스턴스가 메모리의 빈 공간에 생성된다. 주소가 0X100 인 곳에 생성되었다고 가정하고, 

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

color 는 참조형이므로 null로, power는 boolean 이므로 false, channel 은 int 이므로 0으로 초기화된다.

 

 

 

 

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

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

인스턴스를 다루기 위해서는 참조변수가 반드시 필요하다.

아래 그림에서 화살표는 참조변수 t가 Tv 인스턴스를 참조하고 있다는 것을 알기 쉽게 하기 위해 추가한 상징적인 것이다.

 

 

 

 

3. t.channel = 7;

참조변수 t에 저장된 주소에 있는 인스턴스의 멤버변수 channel 에 7을 저장한다. 여기서 알 수 있듯이 인스턴스의 멤버변수(속성)를 사용하려면 '참조변수.멤버변수'와 같이 하면 된다.

 

 

 

 

4. t.channelDown ();

참조변수 t가 참조하고 있는 Tv 인스턴스의 channelDown 메서드를 호출하여 멤버변수 channel 에 저장되어 있는 값을 1 감소시킨다.

 

 

" 인스턴스는 참조변수를 통해서만 다룰 수 있으며, 참조변수의 타입은 인스턴스의 타입과 일치해야 된다."

 

 

 

주소값 예제

public class Thisisjava {
    public static void main(String[] args) {
        Tv t1 = new Tv();
        Tv t2 = new Tv();
        System.out.println("t1 채널 값 : " + t1.channel);
        System.out.println("t2 채널 값 : " + t2.channel);
        t2 = t1;
        t1.channel = 7;
        System.out.println("t1 채널 값 : " + t1.channel);
        System.out.println("t2 채널 값 : " + t2.channel);
        
    }
}

class Tv {
    // tv 속성 (멤버변수)
    String color;
    boolean power;
    int channel;

    void power() {
        power = !power;
    }

    void channelUp() {
        ++channel;
    }

    void channelDown() {
        --channel;
    }
}

 

위 코드에서 t2 = t1; 은 t1이 저장하고 있는 값(주소)를 tv2에 저장한다는 뜻이다.

그림에서 예를 들면 t2의 화살표가 t1의 주소값을 가르키게 되면서, t1의 값이 변하면 t2의 값도 같이 변한다.

 


 

 

객체 배열

 

public class Thisisjava {
    public static void main(String[] args) {

        Tv[] tvArr = new Tv[3]; // Tv tv1, tv2, tv3

        for (int i = 0; i < tvArr.length; i++) {
            tvArr[i] = new Tv();
            tvArr[i].channel += i;

            System.out.printf("tvArr[%d].channel = %d%n", i, tvArr[i].channel);
        }

    }
}

class Tv {
    // tv 속성 (멤버변수)
    String color;
    boolean power;
    int channel;

    void power() {
        power = !power;
    }

    void channelUp() {
        ++channel;
    }

    void channelDown() {
        --channel;
    }
}

 

결과 값

'자바' 카테고리의 다른 글

[JAVA] 변수와 메서드 2  (0) 2023.09.12
[JAVA] 변수와 메서드 1  (0) 2023.09.12
[JAVA] 약수 구하기 알고리즘  (0) 2023.09.06
[자바] 인텔리제이 단축키  (0) 2023.07.31
[자바] 단축키) ctrl + Alt + m 메서드 추출  (0) 2023.07.26