ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 클래스란?
    JAVA/클래스 ( 기본 ) 2023. 5. 3. 12:12
    728x90
    클래스 vs 인스턴스

    우리가 만들고자 하는 대상의 '상태' 와 '기능' 을 함께 가지고 있는 '데이터 타입'

     

    클래스의 사용

    클래스를 사용하기 위해서는, 해당 클래스의 인스턴스를 생성해야 한다.

     

    구문
    클래스이름 변수이름 = new 생성자();
    생성자(): 클래스의 이름과 동일, 클래스의 멤버변수들을 초기화

     

     

    클래스 생성

         구성요소

    • 상태(속성, 필드)
    • 기능(동작)

    클래스는 내가 구현하고자 하는 것이 가지고 있는 상태와 속성을 정의해주고,

    이에 따른 기능을 구현하는 방식으로 진행

     

    TV 클래스를 만들어보자

    public class MyTV {
        
        
       //상태
        private boolean isPowerOn;          // 전원 on/off
        private int channel;                // 현재 채널
        private int volume;                 // 현재 볼륨
    
    
        // TV의 기능(동작) -> 메소드
        public void displayStatus(){
            System.out.println("TV 현재 상태");
            System.out.println("----------------");
            System.out.println("전원 상태: " + isPowerOn); // 동일 클래스 안의 멤버들 사용 가능
            System.out.println("채널 상태: " + channel);
            System.out.println("볼륨 상태: " + volume);
            System.out.println("----------------");
        }
    
        public void powerOnOff(){
            if(isPowerOn){
                isPowerOn = false;
                System.out.println("TV를 끕니다");
            } else{
                isPowerOn = true;
                System.out.println("TV를 켭니다");
            }
        }// END powerOnOff
    
    
        public int channelUp(){
            channel++;
            System.out.println("현재 채널: " + channel);
            return channel;
        }
    
    
        public int channelDown() {
            channel--;
            System.out.println("현재 채널: " + channel);
            return channel;
        } // end channelDown()
    
    
        public int volumeUp() {
            volume++;
            System.out.println("현재 볼륨: " + volume);
            return volume;
        } // end volumneUp()
    
    
        public int volumeDown() {
            volume--;
            System.out.println("현재 볼륨: " + volume);
            return volume;
        } // end volumeDown()}
    
    
    
    }

     

    클래스로 인스턴스 생성

    위에서 만든 클래스로 2가지 인스턴스를 생성해보자

    public class Class01Main {
    
    	public static void main(String[] args) {
    		System.out.println("클래스 생성 & 사용");
    
    		MyTV tv1 = new MyTV();    // MyTV instance 생성!
    		tv1.displayStatus();
    // 전원 상태: false
    // 채널 상태: 0
    // 볼륨 상태: 0
    
    		tv1.powerOnOff();
    		tv1.channelUp();
    		tv1.channelUp();
            tv1.powerOnOff();
    		tv1.displayStatus();
    //TV 현재 상태
    //----------------
    //전원 상태: false
    //채널 상태: 2
    //볼륨 상태: 0
    
    		System.out.println();
    		MyTV tv2 = new MyTV(); // 새로운 instance!
    
    		tv2.powerOnOff();
    		tv2.volumeUp();
    		tv2.volumeUp();
    		tv2.volumeUp();
    		tv2.displayStatus();
    //TV 현재 상태
    //----------------
    //전원 상태: true
    //채널 상태: 0
    //볼륨 상태: 3
    
    		
    	} // end main()
    
    } // end class

     

    new 로 생성하는 instance 들은
    지역변수와는 달리 인스턴스가 생성될 때 (자동으로) 초기화가 된다.
    특별히 초기화를 할 값들이 지정되어 있지 않을 때는 각 변수 타입의 기본값(디폴트 값)으로 초기화가 됨
    boolean -> false, 숫자타입(int, double, ...) -> 0 String, 참조 타입(클래스) -> null

     

     

    동일한 클래스를 통해 tv1과 tv2를 만들었지만,
    tv1 과 tv2 의 상태는 다르다.
    즉, 다른 인스턴스(객체)라는 것

     

     

    메모리 구조

    MyTV 타입의 tv1과  tv2는 main메소드의 지역변수 이므로, STACK 영역에 생성된다.

    그리고 new MyTV()는 새로운 인스턴스를 HEAP 영역에 2개 생성하게 되고 이들은 각각의 공간에서

    3가지 상태(isPower, volume, channel)을 독립적으로 가지게 된다.

    그리고 HEAP영역의 독립적인 두 곳의 주소값이 STACK의 지역변수에 각각 담기게 되는 구조이다.

     

     

    만약,
    tv1 = tv2
    를 하게 된다면?

    대입연산자는 주소값을 tv2 변수에 담긴 주소값을 tv1의 변수 담게 한다. 이렇게 되면, 기존에 tv1 변수가 참조하고 있던 HEAP영역의 인스턴스는 다른 무엇으로부터 참조되지 않게 된다. 

    HEAP 영역에서 내용물의 소멸 조건 : 더이상 참조되어지는 것이 없을 때

    'JAVA > 클래스 ( 기본 )' 카테고리의 다른 글

    생성자 + 캡슐화의 개념  (0) 2023.05.03
Designed by Tistory.