-
[JAVA 공부 4일차] 객체지향 Part 2JAVA 2022. 7. 26. 09:37728x90반응형
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; }
실행 순서 알아보기
- main 함수 호출
- 참조 변수 d에 Data 인스턴스 주소(예 : 주소 0X100) 저장
- 참조 변수 d (예 : 주소 0X100)에 있는 x에 10을 대입한다.
- System.out.println() 실행한다.
- change(d.x) 함수를 호출한다.
- int x의 값을 전달한다.
- change() 함수 실행 => int 타입 x에 1000을 대입한다.
- 이때 x는 위에 있는 x와 아예 다른 주소 값을 가진 변수이다.
- System.out.println() 실행 후 void이기 때문에 자동 return 된다.
- System.out.println() 실행한다.
- 프로그램 종료
// 참조형 매개변수 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; }
실행 순서 알아보기
- main 함수 호출
- 참조 변수 d에 Data 인스턴스 주소(예 : 주소 0X100) 저장
- 참조 변수 d (예 : 주소 0X100)에 있는 x에 10을 대입한다.
- System.out.println() 실행한다.
- change(d) 함수를 호출한다.
- 참조 변수 d의 주소(예 : 주소 0X100)를 전달한다.
- change() 함수 실행 => 참조 변수 d의 주소에 있는 x에 1000을 대입한다.
- System.out.println() 실행 후 void이기 때문에 자동 return 된다.
- System.out.println() 실행한다. = > 참조 변수 d의 주소에 있는 x값이 1000이다.
- 프로그램 종료
// 참조형 반환타입 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; }
실행 순서 알아보기
- main 함수 호출
- 참조 변수 a에 Data 인스턴스 주소(예 : 주소 0X100) 저장
- 참조 변수 a (예 : 주소 0X100)에 있는 x에 10을 대입한다.
- 참조 변수 b에 copy(a) 결과 대입
- copy() 함수에 매개변수로 참조 변수 a의 주소 값 전달
- 참조 변수 tmp에 인스턴스 주소 (예: 주소 0X200) 저장
- tmp에 있는 x값에 a에 있는 x값 대입
- tmp의 주소 값 리턴
- 참조 변수 b의 주소는 0X200이 된다.
- System.out.println() 실행
- System.out.println() 실행
- 프로그램 종료
3. 참조 변수 this & 생성자 this()
참조 변수 this에 대해 몇 가지 알아보자
- 참조 변수 this의 경우 호출한 자기 자신을 의미하기 때문에 호출 전에는 무엇을 의미하는지 알 수 없다.
- 인스턴스 메서드(생성자 포함)에서 사용 가능하다
- 지역변수와 인스턴스 변수를 구분할 때 사용한다.
참조 변수 this와 생성자 this()는 아예 다른 개념이기 때문에 묶어서 이해하지 말아야 한다.
구분 설명 this 참조변수 이기 때문에 인스턴스의 주소가 저장되어 있다. this(), this(매개변수) 생성자, 같은 클래스의 다른 생성자를 호출할 때 사용한다. 728x90반응형'JAVA' 카테고리의 다른 글
[JAVA 공부 5일차] 객체지향 Part 3 (0) 2022.07.27 [JAVA 복습] 객체지향, 배열, 연산 (1) 2022.07.26 [JAVA 공부 3일차] 객체지향 Part 1 (0) 2022.07.25 [JAVA 공부 2일차] if문, 반복문, 배열 (0) 2022.07.22 [JAVA 공부 1일차] JAVA 실행 순서 및 타입, 연산, 문자열 (1) 2022.07.21