ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JAVA 공부 4일차] 객체지향 Part 2
    JAVA 2022. 7. 26. 09:37
    728x90
    반응형

    1. 생성자(constructor)

    생성자 생성하는 방법 : 클래스명( ){ }

    생성자와 기본 생성자를 깐부로 생각해서 꼭 같이 작성해주는게 나중에 에러를 줄일 수 있다.

    • 생성자란 인스턴스 생성 시 호출되는 "인스턴스 초기화 메서드"이다.
    • 모든 클래스에는 반드시 하나 이상의 생성자가 있어야 한다.
      • 생성자가 없다면 컴파일러가 기본 생성자를 추가해준다.

    class를 사용해봤다면 이미 우린 기본 생성자를 호출한 적이 있습니다.

    public class Myclass{
    	public ...{
        	Test a = new Test();
            // 연산자 new에 의해 메모리에 Test클래스의 인스턴스가 생성된다.
            // 생성자 Test()가 호출되어 수행된다.
            // 생성된 Test인스턴스의 주소가 참조변수 a에 저장된다
        }
    }
    
    class Test{ }

    1-1. 기본 생성자 사용방법

    public class Myclass{
    	public static void main(String[] args){
        	
            // 생성자 없을때
            Car c1 = new Car();
            c1.color = "white";
            c1.gearType = "auto";
            c1.door = 4;
            
            // 생성자 있을때
            Car c2 = new Car("red", "auto", 4);
            
            // ⭐ 위 두개 모두 초기화 하는것이다.
            
        }
    }
    
    class Car{
    	String color;
        String gearType;
        int door;
        
        Car(){} // 기본 생성자
        Car(String c, String g, int d){ // 생성자
        	color = c;
            gearType = g;
            door = d;
        }
    }

    1-2. 기본 생성자 활용

    기본 생성자를 통해 디폴드 값을 지정해줄 수 있다.

    public class Myclass{
    	public static void main(String[] args){
        	
        }
    }
    class Box{
    	int width;
        int height;
        String use;
        
        // =======================================
        Box(){ // 기본 생성자
        	// ⭐ 첫줄에만 사용할 수 있다!!! 
        	this(150,100,"packing"); // 생성자 this는 Box 생성자를 가리킨다.
            // == BOX(150,100,"packing")
        }
        
        ⭐ 위와 아래가 같은 역할을 하는것이다.
        // 빠른 개발을 위해서는 위에꺼를 쓰는게 좋다.
        
        Box(){ // 기본 생성자
        	width = 150;
            height = 100;
            use = "packing";
        }
        // =======================================
        
        // =======================================
        Box(int a, int b, String c){ // 생성자
        	width = a;
            height = b;
            use = c;
        }
        
        ⭐ 위와 아래가 같은 코드이다.
        // 인스턴스 변수와 지역변수의 구별을 위해 this를 사용한다.
        
        Box(int a, int b, String c){ // 생성자
        	this.width = a;
            this.height = b;
            this.use = c;
        }
        // =======================================
    }

    2. 기본형 매개변수 & 참조형 매개변수

    기본형의 경우 ReadOnly이며 참조형은 Read & Write가 가능하다.

    // 기본형 매개변수
    
    public class Basic{
    	public static void main(String[] args){
        	Data d = new Data();
            d.x = 10;
            System.out.println("d.x = " + d.x); // d.x = 10
            change(d.x);
            System.out.println("main() : x = " + d.x); // main() : x = 10
        }
        
        static void change(int x){ // int 값을 받는다.
        	x = 1000;	// 매개변수 x에 1000을 넣는다.
            // ⭐ 여기 있는 x는 위에있는 d.x와 다른 것이다.
            System.out.println("change() : x = " + x ); // change() : x = 1000
        }
    }
    
    class Data{
    	int x;
    }

    실행 순서 알아보기

    1. main 함수 호출
    2. 참조 변수 d에 Data 인스턴스 주소(예 : 주소 0X100) 저장 
    3. 참조 변수 d (예 : 주소 0X100)에 있는 x에 10을 대입한다.
    4. System.out.println() 실행한다.
    5. change(d.x) 함수를 호출한다.
      • int x의 값을 전달한다.
    6. change() 함수 실행 => int 타입 x에 1000을 대입한다.
      • 이때 x는 위에 있는 x와 아예 다른 주소 값을 가진 변수이다.
    7. System.out.println() 실행 후 void이기 때문에 자동 return 된다.
    8. System.out.println() 실행한다.
    9. 프로그램 종료
    // 참조형 매개변수
    
    public class Basic{
    	public static void main(String[] args){
        	Data d = new Data();
            d.x = 10;
            System.out.println("d.x = " + d.x); // d.x = 10
            change(d); // 주소 값을 넣는다.
            System.out.println("main() : x = " + d.x); // main() : x = 1000
        }
        
        static void change(Data d){ // 주소값이 들어간다.
        	d.x = 1000; // d의 주소에 x값을 1000으로 바꿔준다.
            System.out.println("change() : x = " + d.x ); // change() : x = 1000
        }
    }
    
    class Data{
    	int x;
    }

    실행 순서 알아보기

    1. main 함수 호출
    2. 참조 변수 d에 Data 인스턴스 주소(예 : 주소 0X100) 저장 
    3. 참조 변수 d (예 : 주소 0X100)에 있는 x에 10을 대입한다.
    4. System.out.println() 실행한다.
    5. change(d) 함수를 호출한다.
      • 참조 변수 d의 주소(예 : 주소 0X100)를 전달한다.
    6. change() 함수 실행 => 참조 변수 d의 주소에 있는 x에 1000을 대입한다.
    7. System.out.println() 실행 후 void이기 때문에 자동 return 된다.
    8. System.out.println() 실행한다. = > 참조 변수 d의 주소에 있는 x값이 1000이다.
    9. 프로그램 종료
    // 참조형 반환타입
    
    public class Re{
    	public static void main(String[] args){
        	Data a = new Data();
            a.x = 10;
            
            Data b = copy(a);
            System.out.println("d.x = " + a.x);
            System.out.println("b.x = " + b.x);
        }
        public static Data copy(Data z){
        	Data tmp = new Data();
            tmp.x = z.x;
            return tmp;
        }
    }
    
    class Data{
    	int x;
    }

    실행 순서 알아보기

    1. main 함수 호출
    2. 참조 변수 a에 Data 인스턴스 주소(예 : 주소 0X100) 저장 
    3. 참조 변수 a (예 : 주소 0X100)에 있는 x에 10을 대입한다.
    4. 참조 변수 b에 copy(a) 결과 대입
      1. copy() 함수에 매개변수로 참조 변수 a의 주소 값 전달
      2. 참조 변수 tmp에 인스턴스 주소 (예: 주소 0X200) 저장
      3. tmp에 있는 x값에 a에 있는 x값 대입
      4. tmp의 주소 값 리턴
    5. 참조 변수 b의 주소는 0X200이 된다.
    6. System.out.println() 실행
    7. System.out.println() 실행
    8. 프로그램 종료

    3. 참조 변수 this & 생성자 this()

    참조 변수 this에 대해 몇 가지 알아보자

    • 참조 변수 this의 경우 호출한 자기 자신을 의미하기 때문에 호출 전에는 무엇을 의미하는지 알 수 없다.
    • 인스턴스 메서드(생성자 포함)에서 사용 가능하다
    • 지역변수와 인스턴스 변수를 구분할 때 사용한다.

    참조 변수 this와 생성자 this()는 아예 다른 개념이기 때문에 묶어서 이해하지 말아야 한다.

    구분 설명
    this 참조변수 이기 때문에 인스턴스의 주소가 저장되어 있다.
    this(), this(매개변수) 생성자, 같은 클래스의 다른 생성자를 호출할 때 사용한다.
    728x90
    반응형
Designed by Tistory.