TIL 7 | 클래스와 객체

softpeter·2021년 9월 14일
0

JAVA

목록 보기
2/9
post-thumbnail

자바의 정석 3rd Edition 기반으로 공부한 글 입니다.

클래스와 객체

1. 클래스(Class)의 정의와 용도

클래스의 정의

  • 객체를 정의해놓은 것
  • TV 설계도

클래스의 용도

  • 객체를 생성하는데 사용

객체의 정의

  • 실제로 존재하는 것. 사물 또는 개념
  • TV

객체의 용도

  • 객체가 가지고 있는 기능과 속성에 따라 다름

2. 객체와 인스턴스

인스턴스

  • 어떤 클래스로부터 만들어진 객체

인스턴스화 (클래스의 인스턴스화)

  • 클래스로부터 객체를 만드는 과정

    클래스 -------------> 인스턴스(객체)

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

  • 클래스에는 객체의 모든 속성과 기능이 정의되어 있기 때문에
    클래스로부터 객체를 생성하면, 클래스에 정의된 속성과 기능을 가진 객체가 생성된다.

속성 (property)

= 멤버변수 (member variable)
= 특성 (attribute)
= 필드 (field)
= 상태 (state)

  • TV의 크기, 길이, 높이, 색상, 볼륨, 채널 등

기능 (function)

= 메서드 (method)
= 함수 (function)
= 행위 (behavior)

  • TV의 켜기, 끄기, 볼륨 높이기, 볼륨 낮추기, 채널 변경하기 등

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

[Code] Tvtest

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의 채널을 낮추는 기능을 하는 메서드
}

public class Main {
    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 + " 입니다.");
    }
}
  1. Tv t;
    Tv클래스 타입의 참조변수 t를 선언한다.
    메모리에 참조변수 t를 위한 공간이 마련된다.
    아직 인스턴스가 생성되지 않았으므로 참조변수로 아무것도 할 수 없다.

  2. t = new Tv();
    연산자 new에 의해 Tv클래스의 인스턴스가 메모리의 빈 공간에 생성된다. (주소 할당)
    이 때, 멤버변수는 각 자료형에 해당하는 기본값으로 초기화 된다.

    • color는 참조형이므로 null
    • power는 boolean이므로 false
    • channel은 int이므로 0
      그 다음에는 대입연산자(=)에 의해서 생성된 객체의 주소값이 참조변수 t에 저장된다.
      이제는 참조변수 t를 통해 Tv인스턴스에 접근할 수 있다.
      인스턴스를 다루기 위해서는 참조변수가 반드시 필요하다.
  3. t.channel = 7;
    참조변수 t에 저장된 주소에 있는 인스턴스의 멤버변수 channel에 7을 저장한다.

  4. t.channelDown();
    참조변수 t가 참조하고 있는 Tv인스턴스의 channelDown메서드를 호출한다.
    channelDown()에 의해서 channel의 값은 7에서 6이 된다.

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

[Code] Tvtest2

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의 채널을 낮추는 기능을 하는 메서드
}

public class Main {
    public static void main(String[] args) {
        Tv t1 = new Tv();   // Tv t1; t1 = new Tv(); 를 한 문장으로 가능
        Tv t2 = new Tv();
        System.out.println("t1의 channel값은 " + t1.channel + "입니다.");
        System.out.println("t2의 channel값은 " + t2.channel + "입니다.");

        t1.channel = 7;
        System.out.println("t1의 channel값을 7로 변경하였습니다.");

        System.out.println("t1의 channel값은 " + t1.channel + "입니다.");
        System.out.println("t2의 channel값은 " + t2.channel + "입니다.");
    }
}

같은 클래스로부터 생성되었을지라도 각 인스턴스의 속성(멤버변수)은 서로 다른 값을 유지할 수 있으며,
메서드의 내용은 모든 인스턴스에 대해 동일하다.

[Code] Tvtest3

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의 채널을 낮추는 기능을 하는 메서드
}

public class Main {
    public static void main(String[] args) {
        Tv t1 = new Tv();   // Tv t1; t1 = new Tv(); 를 한 문장으로 가능
        Tv t2 = new Tv();
        System.out.println("t1의 channel값은 " + t1.channel + "입니다.");
        System.out.println("t2의 channel값은 " + t2.channel + "입니다.");

        t2= t1;
        t1.channel = 7;
        System.out.println("t1의 channel값을 7로 변경하였습니다.");

        System.out.println("t1의 channel값은 " + t1.channel + "입니다.");
        System.out.println("t2의 channel값은 " + t2.channel + "입니다.");
    }
}
  1. t2 = t1;
    t1은 참조변수이므로, 인스턴스의 주소를 저장하고 있다.
    이 문장이 수행되면, t2가 가지고 있던 값은 잃어버리게 되고 t1에 저장되어 있던 값이 t2에 저장되게 된다.

    t2 역시 t1이 참조하고 있던 인스턴스를 같이 참조하게 되고,
    t2가 원래 참조하고 있던 인스턴스는 더 이상 사용할 수 없게 된다.

참조변수에는 하나의 값(주소)만이 저장될 수 있다.
둘 이상의 참조변수가 하나의 인스턴스를 가리키는(참조하는) 것은 가능하지만,
하나의 참조변수로 여러 개의 인스턴스를 가리키는 것은 불가능하다.

5. 객체 배열

많은 수의 객체를 다뤄야할 때, 사용한다.
객체 배열 안에 객체가 저장되는 것이 아닌, 객체의 주소가 저장된다.
사실 객체 배열은 참조변수들을 하나로 묶은 참조 변수 배열이다.

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

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

[Code] Tvtest4

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의 채널을 낮추는 기능을 하는 메서드
}

public class Main {
    public static void main(String[] args) {
        Tv[] tvArr = new Tv[3];

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

        for(int i=0; i <tvArr.length; i++) {
            tvArr[i].channelUp();
            System.out.printf("tvArr[%d].channel=%d%n", i, tvArr[i].channel);
        }
    }
}

6. 클래스의 또 다른 정의

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

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

변수 ---> 배열 ---> 구조체 ---> 클래스

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

변수와 함수가 서로 유기적으로 연결되어 작업이 간단하고 명료해진다.

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

사용자정의 타입 = 프로그래머가 서로 관련된 변수들을 묶어서 하나의 타입으로 새로 추가하는 것

class Time {
    int   hour;
    int   minute;
    float second;
}

시, 분, 초를 저장하기 위한 세 변수를 멤버변수로 갖는 Time클래스를 정의한 것이다.

보다 정확한 데이터를 유지할 수 있다.

profile
dev.Back-end | Aal izz well

0개의 댓글