도서/자바의 신

[도서/자바의 신] #8 참조 자료형에 대해서 더 자세히 알아봅시다

yulee_to 2022. 12. 21. 15:25

자바의 신

✔️이 글은 [자바의 신 - 이상민 지음] 도서를 바탕으로 정리한 글입니다. 


참조 자료형은 나머지 다에요

기본 자료형 8개를 제외한 나머지 타입을 모두 참조 자료형(Reference type)이다.

String을 제외한 나머지 참조 자료형은 사용할 수 있는 연산자가 등호(=) 뿐이다.

기본 생성자

자바는 생성자를 따로 정의해주지 않으면 기본 생성자가 만들어진다.

생성자는 public 키워드 뒤에 클래스 이름과 같은 이름을 갖는 메소드 이름을 지정해주고 매개변수를 넣어주면 된다. 따로 타입은 지정하지 않는다.

매개변수의 개수나 타입에 따라 생성자를 여러개 만들어줘도 된다. 그러면 new를 통해 객체를 생성할 때 생성자에 넘겨주는 인자에 따라 맞는 생성자 메소드가 사용된다.

생성자는 몇 개까지 만들 수 있을까?

생성자는 개수에 제한없이 만들 수 있다. 매개변수 또한 개수에 제한이 없다.

 

자바의 패턴 중에 DTO(Data Transfer Object)라는 것이 있는데 여러개의 속성들을 갖는 객체를 쉽게 전달하기 위해 사용된다.

필요한 데이터를 선별해 보내줄 수 있어 중요한 정보를 노출시키지 않고 두 시스템(API와 서버 등) 간 통신을 원할하게 촉진한다는 장점이 있다.

DTO에는 데이터만 저장하고, 용량이 작은 단순한 환경으로 한 가지 작업만 수행하는 것이 좋다. 

 

비슷한 클래스로 VO(Value Object)라는 것이 있다.

DTO와 형태는 같지만, VO는 데이터를 담아 두기 위한 목적으로 사용되며, DTO는 데이터를 다른 서버로 전달하기 위한 것이 주 목적이다.

또 VO는 저장된 데이터들을 읽는 것만 가능하고, DTO는 read와 write 둘다 가능하다.

이 객체의 변수와 매개 변수를 구분하기 위한 this

this는 "이 객체"라는 의미로 인스턴스(객체)를 참조하는 키워드이다.

메소드 안에서 매개변수와 인스턴스 변수의 이름이 같을 때 이를 구분하기 위해서 주로 사용된다.

메소드 overloading

메소드의 접근 지정자, 타입, 이름이 모두 같지만 매개변수들만 다른 메소드들을 정의하는 것을 오버로딩(overloading)이라고 한다.

매개변수의 개수가 다를 경우, 개수가 같아도 타입과 그 순서가 다를 경우 다른 메소드로 인지한다.

대표적인 예시로 System.out.prinltn()이 있는데 괄호 안에 들어가는 값의 타입에 따라 매개변수의 개수와 타입이 일치하는 메소드를 실행해준다.

메소드에서 값 넘겨주기

자바의 메소드가 종료되는 경우

  • 메소드의 모든 문장이 실행되었을 때 
  • return 문장에 도달했을 때
  • 예외가 발생(throw)했을 때

자바의 메소드에선 모든 타입을 한개만 리턴 타입으로 넘겨줄 수 있다.

void의 경우는 리턴 값이 없다는 의미로 return;만 해주면 된다.

 

메소드의 리턴 타입이 void가 아닌데 메소드 내에서 일치하는 타입의 값을 return해주지 않으면 에러가 발새한다.

return 문장을 만나 수행되면 메소드가 바로 종료되고 그 뒤에 오는 메소드 내의 문장들은 실행하지 않는다.

절대 도달할 수 없는 return 뒤의 문장이 있으면 unreachable statement라는 메시지와 함께 컴파일 에러가 발생한다. 

여러개의 값을 return해주고 싶을 때는 앞서 배운 DTO를 사용해주면 된다.

static 메소드와 일반 메소드의 차이

static 메소드는 객체를 생성하지 않아도 호출할 수 있다. main 문에 static을 써주는 이유이기도 하다.

static 키워드는 리턴 타입 앞에 써주면 된다.

static 메소드 내에서 사용할 수 있는 변수는 static이 붙은 클래스 변수와 그 메소드 내에서 선언한 지역변수만 사용 가능하다는 점이 중요하다.

static 블록

어떤 클래스 객체가 여러개 생성돼도 처음 생성될 때만 한번 불려지는 코드를 쓸 때는 static 블록을 사용하면 된다.

static {
//딱 한번만 수행되는 코드 
}

객체가 생성되기 전에 호출되므로 객체의 생성자 이전에 수행된다.

static 블록은 여러개 작성할 수 있고 선언되어 있는 순서대로 호출된다.

static 블록 내에는 당연히도 static 메소드와 마찬가지로 static한 것들만 호출될 수 있다.

Pass by Value, Pass by Reference

기본 자료형은 무조건 Pass by Value로 데이터를 전달하고, 참조 자료형은 Pass by Reference로 전달한다.

  • Pass by Value : 값만 전달, 값을 변경해도 실제 데이터는 바뀌지 않음
  • Pass by Reference : 객체에 대한 참조가 전달, 값을 변경하면 실제 데이터가 바뀜

매개 변수를 지정하는 특이한 방법

매개 변수의 개수가 정확히 정해져 있지 않은 경우 임의의 개수의 매개변수(Arbitrary Number of Arguments)인 가변인자를 사용하면 된다. 가변인자는 배열로 인식된다.

타입과 변수명 사이에 점을 3개(...) 써주면 된다. 매개변수가 여러개라면 가변인자는 반드시 맨 마지막에 한번만 사용해야 한다.


정리해 봅시다

1. 생성자는 반드시 만들어야 하나요?

NO. 만들지 않으면 기본 생성자를 자바에서 자동으로 만들어준다.

2. 만약 매개 변수가 있는 생성자를 만들고, 매개 변수가 없는 기본 생성자를 호출하면 어떻게 될까요?

컴파일 에러가 발생한다.

3. 생성자의 개수는 제한이 있나요?

NO

4. 인스턴스의 변수와 매개 변수나 메소드 내에서 생성한 변수와 구분하기 위해서 사용하는 키워드는 무엇인가요?

this

5. 메소드 선언시 리턴 타입으로 지정한 데이터를 넘겨줄 때 필요한 키워드는 무엇인가요?

return

6. 메소드 선언시 아무 데이터도 리턴 타입으로 넘겨주지 않겠다는 것을 지정하는 키워드는 무엇인가요?

void

7. 메소드 선언에 static이 있는 것과 없는 것의 차이는 무엇인가요?

static이 있으면 객체를 생성하지 않아도 메소드를 호출할 수 있다.

8. 필자라 엄청나게 중요하다고 한 것 중 메소드의 이름은 같으나 매개 변수를 다르게 하는 것의 명칭은 무엇인가요?

overloading

9. 기본 자료형을 매개 변수로 넘겨줄 때 pass by value인가요? 아니면 pass by reference인가요?

Pass by value

10. 참조 자료형을 매개 변수로 넘겨줄 때 pass by value인가요? 아니면 pass by reference인가요?

Pass by reference

11. 매개 변수의 수가 가변적일 때 메소드 선언시 타입과 변수 이름 사이에 어떤 것을 적어줘야 하나요?

...(점 3개)

728x90