오늘의하루

[JAVA 공부 4일차] 객체지향 Part 2 본문

JAVA

[JAVA 공부 4일차] 객체지향 Part 2

오늘의하루_master 2022. 7. 26. 09:37

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(매개변수) 생성자, 같은 클래스의 다른 생성자를 호출할 때 사용한다.
Comments