참조 자료형
참조 자료형이란?
- 기본 자료형 8개를 제외한 나머지 타입은 모두 참조 자료형
- 객체 생성 방식
- new 생성자();
생성자
기본 생성자란?
- 매개 변수가 없는 생성자
- 생성자를 따로 만들지 않아도 자동으로 만들어지는 생성자
- 다른 생성자가 없을 경우 기본으로 컴파일할 때 만들어진다.
- 다른 생성자가 존재하는 경우 기본으로 만들어지지 않기에 필요하다면 별도로 만들어준다.
생성자
- 생성자는 클래스의 객체를 생성하기 위해서 존재한다.
- 메소드와 비슷한 형태로 생겼지만 리턴 타입이 없고 메소드 이름 대신 클래스 명과 동일하게 이름을 지정한다.
- 생성자 작성 시 다른 메소드들보다 위, 가장 윗부분에 작성하는 것이 좋다.
- 생성자가 없는 클래스 중에서도 객체를 얻을 수 있는 경우가 있다.
- 여러 가지 매개 변수를 갖는 여러 생성자를 가질 수 있다.
- 생성자는 매개 변수의 제한이 없고 몇 개를 만들어도 상관 없다.
- 너무 많으면 관리가 힘들어지니 꼭 필요한 생성자만 생성하기!!
- DTO(Data Transfer Object) 패턴
- 어떤 속성을 갖는 클래스를 만들고 속성들을 쉽게 전달하기 위한 목적
- DTO의 장점
- 자바의 메소드는 선언 시 리턴 타입을 한가지만 선언할 수 있는데 복합적인 데이터를 리턴하려면 복잡하다. 배열 혹은 여러 타입의 데이터라면 복잡해지는 부분을 DTO를 만들어 리턴 타입에 DTO를 사용해 객체를 리턴해줄 수 있다.
- VO(Value Object) 패턴
- DTO와 형태는 동일하지만 데이터를 담아두기 위한 목적
- DTO에 포함된다고 볼 수 있다.
패턴: 비슷한 기능을 하는 규칙에 하나의 이름을 정해 놓은 것.
- this 키워드
- 객체의 변수와 매개 변수나 메소드 내에서 생성한 변수의 이름이 동일할 때 인스턴스의 변수를 구분하기 위해 사용한다.
- this 키워드가 붙은 변수가 인스턴스 변수
- this 키워드를 붙여줌으로써 이 변수가 매개 변수의 변수가 아닌 객체의 변수(인스턴스 변수)임을 명시적으로 지정해주는 것이다.
- 메소드에도 this를 지정할 수 있다.
public class Member {
public String name
public void setName(String name){
// this 키워드가 붙은 name이 인스턴스 변수의 name
this.name = name;
}
}
메소드 오버로딩 (Overloading)
- 메소드의 이름은 같게하고 매개 변수만 다르게 정의하는 것
- 매개 변수의 개수와 타입이 같아도 타입의 순서가 다르면 다른 메소드로 인식한다.
- 매개 변수의 이름이 중요한 것이 아닌 매개 변수의 타입이 중요하다.
- 매개 변수 타입이 같고 변수 이름이 달라도 같은 메소드로 인식한다.
- "같은 역할을 하는 메소드는 같은 메소드 이름을 가져야 한다"를 모토로 사용
- 생성자도 오버로드에 일종
public static int add(int a, int b){
// 내용 생략
}
public static double add(double a, double b){
// 내용 생략
}
add(1,2);
// 위 add()를 호출했을 때 어떻게 될 것인가?
- 위 예시에서는 메소드 오버로딩을 통해 같은 메소드명이며 매개 변수의 개수도 2개인 메소드가 2가지 있다.
- 이 경우 add() 메소드를 호출하면 어떤 메소드가 호출될까?
- 자신과 조금이라도 더 적합한 메소드를 찾는다.
- 일치하는 타입의 메소드가 없다면 형 변환이 가능한 타입의 메소드가 있는지 찾는다.
- 그렇기에 add(1, 2)인 경우에는 매개 변수타입이 일치하는 add(int, int)를 호출한다.
- add(1.2, 2.2)인 경우 매개 변수 타입이 일치하는 add(double, double)을 호출한다.
- 자신과 조금이라도 더 적합한 메소드를 찾는다.
- 만약 add(int, int) 메소드가 없다는 가정하에 add(1, 2)를 호출하면 어떻게 될까?
- 메소드의 매개 변수 타입과 호출한 인수의 타입이 다르지만 int가 double보다 타입의 범위가 작기에 범위가 작은 타입이 큰 타입으로의 형 변환은 컴파일러에 의해 자동으로 일어난다.
그렇기에 add(1,2)를 호출해도 add(double, double) 메소드가 정상적으로 호출된다. - 메소드 매개 변수와 인수 사이에도 형 변환이 일어난다.
- 메소드의 매개 변수 타입과 호출한 인수의 타입이 다르지만 int가 double보다 타입의 범위가 작기에 범위가 작은 타입이 큰 타입으로의 형 변환은 컴파일러에 의해 자동으로 일어난다.
- 이 경우 add() 메소드를 호출하면 어떤 메소드가 호출될까?
메소드
메소드가 종료되는 조건
- 메소드의 모든 문장이 실행되었을 때
- return 타입이 void인 경우
- void 타입에서 중도에 종료하고 싶은 경우 return; 처럼 return 뒤에 아무것도 적지 않아도 메소드 실행 종료가 가능하다.
- return 타입이 void인 경우
- return 문장에 도달했을 때
- return 문장 뒤에 다른 문장이 있더라도 실행이 되지 않는다. (컴파일 에러)
- return에 도달하면 그 위치에서 메소드는 종료되기 때문에
- return 문장 뒤에 다른 문장이 있더라도 실행이 되지 않는다. (컴파일 에러)
- 예외가 발생(throw)했을 때
- 메소드는 모든 타입을 한 개만 리턴타입으로 넘겨줄 수 있다.
- 모든 기본 자료형 / 참조 자료형 중 하나를 return 할 수 있다.
- 여러 개의 데이터를 하나의 타입으로 넘겨주기 위해서 DTO를 사용하는 것.
- if 조건문안에 return 문장이 있을 경우, return 문장은 한 메소드 내에 두 개 이상 있어야 한다.
static 메소드와 일반 메소드의 차이
static 메소드
- static은 객체를 생성하지 않아도 메소드를 호출할 수 있는 메소드.
- static 메소드의 단점
- 클래스 변수만 사용할 수 있다.
static 변수
- static 변수 = 클래스 변수
- 클래스 변수는 메모리에 고정적으로 할당되어 프로그램이 종료될 때 해제되는 변수
- 모든 객체에서 하나의 값을 공유하여 사용한다.
static 블록
ex) static block Example
static int data = 1;
// static 블록은 생성자 호출 전 한 번만 호출된다.
static {
System.out.println("hi");
}
public static int getData(){
return data;
}
- 객체는 여러 개 생성하지만 한 번만 호출되어야 하는 코드의 경우 static 블록을 사용한다.
- 객체가 생성되기 전 한 번만 호출되고 이후에는 호출할 수 없다.
- 생성자가 호출되기 전에 static 블록이 먼저 한 번 호출된다.
- 클래스 내에 선언해야 한다.
- 메소드 내에서 선언할 수 없다.
- 즉, 메소드나 생성자에 속해 있으면 안된다.
- static한 것들을 호출할 수 있다.
- static 변수 = 클래스 변수
- static 메소드
toString() 메소드
- 객체가 가지고 있는 정보나 값들을 문자열로 만들어 리턴하는 메소드
- 메소드 오버로딩을 통해 의미있는 값을 리턴하도록 오버로딩하는 경우가 있다.
Pass(Call) By Value / Pass(Call) By Reference
- Pass By Value : 값을 전달한다 / 값만 전달한다
- 자바는 항상 변수의 값을 복사해서 전달한다.
- 메소드의 매개 변수로 넘길 때 원래 값은 놔두고 복제된 값을 넘기기에 원래 값은 변하지 않는다.
- 기본 자료형은 무조건 Pass By Value로 데이터를 전달한다.
- Pass By Reference : 값이 아닌 참조를 전달한다.
- 참조형 변수도 일반 변수와 마찬가지로 값을 전달하는데 참조형 변수는 참조(주소) 값을 가진 변수이므로 참조 값을 복사해서 전달한다.
- 메소드의 매개 변수로 객체를 넘겨 변경하게 되면 호출한 참조 자료형 안의 객체도 호출된 메소드에서 변경한 대로 데이터가 변경된다.
- 참조 값(주소 값)을 복사하여 전달받았기에 전달 받은 객체에서도 같은 주소를 참조하고 있으므로 값을 변경하면 원본 객체에도 영향을 미치게 되는 것이다.
- 참조 자료형은 값이 아닌 참조 값이 전달되는 Pass By Reference 이다.
매개 변수를 지정하는 특이한 방법
- 매개 변수가 몇 개인지, 호출할 때마다 바뀌는 경우에는 어떻게 할까?
- 매개 변수로 배열을 넘겨주는 방법
- 계산기인 경우 매개 변수로 넘겨줄 때 계산할 숫자들을 모두 배열로 만든 후 넘겨줘야한다는 단점이 존재
- 매개 변수로 임의 개수의 매개 변수를 넘겨주는 방법
- 매개 변수를 "타입...변수명"으로 선언
- ...을 적을 때 연속해서 적어줘야하며 사이에 공백이 있으면 안된다.
- 하나의 메소드에서 한 번만 사용가능
- 여러 매개 변수가 있다면, 가장 마지막 매개 변수로 선언해줘야 한다.
- ex) public void message(String message, int ... numbers) { }
- 매개 변수로 배열을 넘겨주는 방법
// 한 개의 메소드 당 한 번만 사용 가능, 맨 마지막 매개 변수에 위치해야한다.
public void sendMessage(String message, int...numbers) { }
간단 내용 정리
1. 생성자는 반드시 만들어야 하나요?
ㅡ> 생성자가 없으면 기본 생성자가 자동으로 생성되므로 반드시 만들 필요는 없지만 만드는 습관을 가지면 좋다.
2. 만약 매개변수가 있는 생성자를 만들고, 매개변수가 없는 기본 생성자를 호출하면 어떻게 될까요?
ㅡ> 생성자가 있는 경우 기본 생성자는 자동으로 생성되지 않으므로 기본 생성자 호출을 할 수 없고 컴파일 에러가 발생.
3. 생성자의 개수는 제한이 있나요?
ㅡ> X
4. 인스턴스의 변수와 매개변수나 메소드 내에서 생성한 변수와 구분하기 위해서 사용하는 키워드는 무엇인가요?
ㅡ> this 키워드, 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. 매개변수의 수가 가변적일 때 메소드 선언시 타입과 변수 이름 사이에 어떤 것을 적어줘야 하나요?
ㅡ> ... 으로 변수타입...변수명으로 선언한다.
출처: 이상민, <자바의 신 VOL.1> 로드북
'Java > 자바의 신 VOL.1' 카테고리의 다른 글
10. 자바는 상속이라는 것이 있어요 (0) | 2024.06.21 |
---|---|
09. 자바를 배우면 패키지와 접근 제어자는 꼭 알아야 해요 (0) | 2024.06.20 |
07. 여러 데이터를 하나에 넣을 수는 없을까요? (0) | 2024.06.20 |
06. 제가 조건을 좀 따져요 (1) | 2024.06.19 |
05. 계산을 하고 싶어요 (0) | 2024.06.19 |