▶ JAVA/개념정리

[Java] 11.객체지향언어(2)_클래스

휴학생감자 2022. 3. 7. 22:04

1. 클래스와 인스턴스

→ 클래스로부터 만들어진 객체를 해당 클래스의 인스턴스라고 함.

 

#인스턴스를 생성하고 사용해보는 예제

class Tv{
    String color;
    int channel;
    boolean power;

    void power(){
        power = !power;
    }
    void channelUp(){
        ++channel;
    }
    void channelDown(){
        --channel;
    }
}

public class exCode {
    public static void main(String[] args) {
        Tv t1 = new Tv();
        t1.channel = 7;
        t1.channelDown();
        System.out.println("현재 t1 채널의 번호는 " + t1.channel + "입니다.");

        Tv t2 = new Tv();
        System.out.println("현재 t2 채널의 번호는 " + t2.channel + "입니다."); //default값인 0이 출력됨
        t2 = t1;
        System.out.println("현재 t2 채널의 번호는 " + t2.channel + "입니다.");
    }
}

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

§ t2 = t1을 통해 t1이 가리키던 인스턴스를 t2도 동일하게 가르키도록 변하였다.

     따라서, t2의 채널번호가 t1의 채널번호와 동일한 것이다.

§ 자신을 참조하고 있는 참조변수가 하나도 없는 인스턴스는 garbage collector에 의해 메모리에서 자동 제거된다.

 


2. 변수의 종류

 

선언위치에 따른 변수 구분

- 클래스 변수 : static 변수, 공유변수를 말하며, 클래스가 메모리에 올라갈 때 생성된다.

- 인스턴스 변수 : 인스턴스별로 독립적인 저장공간을 가지므로, 서로 다른 값을 가져야 하는 경우 사용한다.

                               인스턴스가 생성될 때 변수도 같이 생성된다.

- 지역 변수 : 변수 선언문이 수행될 때 생성되며, 메서드 내에서만 사용 가능하므로 메서드 종료 시 소멸된다.

 

+) 클래스 변수와 인스턴스 변수는 멤버변수(인스턴스의 속성)에 속한다!

 

class Card{
    String kind;
    int number;
    static int width = 100;
    static int height = 250;
}

public class exCode {
    public static void main(String[] args) {
        System.out.println("Card.width = " + Card.width);
        System.out.println("Card.height = " + Card.height);

        Card c1 = new Card();
        c1.kind = "Heart";
        c1.number = 7;

        Card c2 = new Card();
        c2.kind = "Spade";
        c2.number = 4;

        System.out.println("카드 c1의 정보 : " + c1.kind + "," 
        + c1.number + "," + c1.width + "," + c1.height);
        System.out.println("카드 c2의 정보 : " + c2.kind + "," 
        + c2.number + "," + c2.width + "," + c2.height);

        c1.width = 50;
        c1.height = 80;

        System.out.println("카드 c1의 정보 : " + c1.kind + "," + c1.number + "," 
        + c1.width + "," + c1.height);
        System.out.println("카드 c2의 정보 : " + c2.kind + "," + c2.number + "," 
        + c2.width + "," + c2.height);
    }
}

[실행 결과]

멤버변수 중 width, height는 클래스 변수이므로 모든 인스턴스가 공통으로 사용하는 값이 된다.

따라서, 특정 인스턴스의 참조변수로 클래스 변수의 값을 변경하면 모든 인스턴스에서 값이 바뀌게 된다.

 

§ 즉, 인스턴스 변수인 kind와 number은 인스턴스가 생성될 때마다 새로운 값으로 저장할 수 있지만, 클래스 변수는 모든 인스턴스가 하나의 저장공간을 공유하므로 항상 공통된 값을 가진다.

§ 클래스변수는 클래스가 메모리에 올라갈 때 생성되므로 객체를 생성하지 않아도 직접 사용 가능하다.

     '클래스이름.클래스변수'의 형태로 사용하면 된다.

 


3. 메서드

특정 작업을 수행하는 일련의 문장들을 하나로 묶은 것

 

메서드 선언부

메서드의 이름, 매개변수의 선언, 반환타입으로 구성되어 있으며, 여기서 선언된 매개변수도 메서드 내에 선언된 것으로 간주하여 지역변수에 해당된다.

또한, 메서드는 후에 변경사항이 발생하지 않도록 신중히 작성해야 한다.

 

메서드 구현부

말그대로 메서드를 호출했을 때 수행될 문장들을 작성하는 부분이다.

선언부 뒤의 괄호{} 안의 내용들은 모두 구현부에 해당된다.

 

main메서드는 프로그램 실행 시 OS에 자동적으로 호출되나,

메서드는 정의되었다 하더라도 호출하지 않으면 아무런 작업도 수행하지 않는다.

 

또한, 메서드는 입력값이나 출력값(결과)가 없을 수 있으며, 둘 다 없을 수도 있다.

 

메서드의 선언부에 작성된 인자의 개수와 순서, 타입은 반드시 호출한 쪽에서도 일치시켜 호출해야 한다.

+) 호출한 쪽에서는 인자(원본), 호출된 쪽에서는 매개변수(복사본)라고 부른다.

 

int add (int x, int y) { x + y };     → x와 y는 매개변수

int result = add (3, 5);                → 3과 5는 인자

 

같은 클래스 내의 메서드끼리는 참조변수를 사용하지 안하도 서로 호출이 가능하나,

      static메서드는 같은 클래스 내의 인스턴스 메서드를 호출할 수 없다.

      (두 메서드의 생성 시기가 서로 다르기 때문)

 

 

 

 

 

 

'▶ JAVA > 개념정리' 카테고리의 다른 글

[Java] 13. 객체지향언어(4)_상속  (3) 2022.03.11
[Java] 12.객체지향언어(3)_클래스  (0) 2022.03.08
[Java] 10. 객체지향언어(1)_클래스  (0) 2022.02.10
[Java] 9. 배열_예제  (0) 2022.02.07
[Java] 8. 배열  (0) 2022.02.04