Coding 공부/Java

[Java_Summary] 클래스(2) 생성자의 오버로딩, 객체의 깊은 복사와 얕은 복사, this, 객체의 메소드, 메소드 오버로딩, 가비지

CBJH 2024. 2. 2. 15:00
728x90
반응형

1. 생성자(Constructor) 오버로딩

10번째 줄 Aircon()과 16번째 줄 Aircon(String company, String color, int price)를 보면 똑같은 생성자이지만 매개변수 숫자가 다르다. 이런 것을 오버로딩이라고 한다. 

오버로딩 : 같은 메서드 이름을 여러개 정의한다.

>>오버로딩을 하는 이유 : 코드가 길어지거나 다른사람과 일을 협력해서 할 때, 헷갈리지 않고 생산성이 높아지기 때문이다. (ex. print함수 : 인자에 문자열, 정수형, 소수형 등 다양한 자료형을 넣어도 출력이 된다.)

 

2. 객체의 깊은 복사와 얕은 복사

객체를 생성할 때마다 Stack영역에서 해당 객체를 가리키는 aircon, aircon1, aircon2이 생성되고,

Heap영역에는 해당 클래스의 메모리 영역이 각각 생성된다.

 

클래스의 깊은 복사는 각 객체를 생성해서 각각의 속성을 각각 읽어들이는 복사이다.

얕은 복사는 aircon1 = aircon2;처럼 aircon1이 가리키는 주소를 aircon2로 바꾸어 Heap의 같은 메모리 영역을 갖도록 한다. 

>>얕은 복사를 하면 aircon2를 수정해도 aircon1값이 같이 수정된다.

 

3. 생성자 오버로딩을 깔끔하게 사용하는 방법

12번재 줄에 this(model, "은색", 250);를 입력하면 매개변수가 3개이기 때문에 19번째 줄에 있는 생성자에 접근해서 값을 초기화한다. >>this소괄호이므로 메서드라고 볼 수 있다. 

this();는 본인 클래스의 생성자를 호출한다. super();는 상속받은 부모 클래스의 생성자를 호출한다.

 

214p까지 예제문제 코딩

235p Open Challenge코딩

공유폴더 확인문제 풀기

 

4. new 연산자와 객체 생성, 레퍼런스 변수

Car myCar = new Car(model, color, maxSpeed); 

myCar은 객체이지만 레퍼런스 변수라고도 부른다. 

new연산자를 사용해서 new Car();를 하면 생성자에 접근해서 객체를 생성한다. 

 

5. this의 필요성

일반적으로 생성자에서 속성값을 초기화하는 경우 this를 사용하지 않고 멤버변수만 가져와 값을 바꾸더라도 문제가 없다. 대신에 멤버 변수와 같은 이름의 지역변수를 불러와 초기화를 하고 싶을 경우 this를 사용해야 문제가 생기지 않는다. 그리고 코드를 읽는 사람에게 그 용도를 나타내므로 생략하지 않고 나타내는 것이 좋다.

 

6. 레퍼런스 배열 선언 및 생성

Car myCar = new Car[5];

Car객체에 대한 래퍼런스 5개 생성

for(int i = 0; i< myCar.length; i++){
  myCar[i] = new Car(i);

 

6. 클래스 메소드 활용

 

메소드는 클래스의 멤버 함수이다. 

접근 지정자는 public, private, protected, 디폴트의 4가지 유형이 있다. 

인자에는 기본 타입 자료형, 객체, 배열이 전달될 수 있다. 객체, 배열이 전달되는 경우 객체 전체가 아니라 레퍼런스 값이 전달되어 얕은 복사가 이루어진다. 

 

7. 메소드 오버로딩

한 클래스 내에, 이름이 같지만 매개변수의 타입이나 개수가 서로 다른 여러 개의 메소드를 중복 작성할 수 있다.

메소드의 이름이 동일하다.

매개변수의 개수나 타입이 서로 달라야한다.

메소드 오버로딩 예시

>>자바 컴파일러는 각 호출문에 대해, 매개변수의 탕비과 개수에 일치하는 getSum() 메소드를 찾아낸다.

 

8. 객체의 소멸과 가비지 컬렉션

c나 c++의 경우 객체가 생성되어 소멸할 때 소멸자 함수나 연산자를 사용해야 메모리를 반환한다. 하지만 자바에서는 new로 할당받은 배열이나 객체의 메모리를 자동으로 가비지 컬렉터(Garbage collector)에 넣어 적절한 시점에 자동으로 수집하여 가용 메모리에 반환시킨다.

 

8-1. 가비지

가비지란 자바에서 더이상 사용하지 않게 된 객체나 배열 메모리를 의미한다. 거이상 참조하는 레퍼런스가 하나도 없는 객체나 배열을 가비지로 판ㅎ단하여 가용 메모리에 반환시킨다.

 

8-2. 가비지 컬렉션

자바에선 가용 메모리가 일정 크기 이하로 줄어들면 자동으로 가비지를 회수하여 가용 메모리를 늘린다. 이것을 가비지 컬렉션이라 부른다.

 

8-3 가비지 컬렉션 강제요청

응용프로그램에서 System.gc();를 요청하면 강제로 가비지 컬렉션을 동작한다.