들어가기 전
해당 내용은 자바의 신 3판을 읽고 내용 정리 및 공부한 내용을 정리한 글입니다!
자바의 신 Vol 1: 기초 문법편 | 이상민 - 교보문고
자바의 신 Vol 1: 기초 문법편 | 현장 전문가가 쓴 자바 기초 입문서다. NAVER, NHN, SKPlanet 등에서 성능 전문가의 풍부한 경험을 바탕으로 자바를 실무에 맞게 제대로 쓸 줄 알게 해주는 입문서를 목
product.kyobobook.co.kr
8장. 참조 자료형에 대해서 더 자세히 알아봅시다.
1. 참조자료형
기본 자료형 8개(byte, short, int,long,float,double, char, boolean) 를 제외한 나머지 타입은 모두 참조자료형이다.
참조자료형은 new 연산자로 객체를 생성한다(new 없이 객체를 생성할 수 있는 참조자료형은 오직 String뿐이다.)
+ 연산자는 참조 자료형 중 String 클래스만 사용이 가능하며 다른 참조 자료형들이 사용할 수 있는 연산자는 값을 할당하기 위한 = 뿐이다.
(1) 생성자
참조 자료형은 new를 사용하여 객체를 사용한다고 했는데, new 뒤에 나오는 것이 바로 생성자다.
ReferenceDefault referenceDefault = new ReferenceDefault();
자바의 생성자는 자바 클래스의 객체(또는 인스턴스)를 생성하기 위해서 존재한다.
메소드와 선언 방식이 비슷한데,
선언부에 리턴타입이 없고, 메소드 이름 대신 클래스 이름과 동일하게 이름을 지정하는 것 뿐이다.
생성자에 리턴 타입이 없는 이유는 컴파일러가 생성자 인지 알아 차릴 수 있기 때문이다.
또한 생정자는 가장 윗부분에 선선하는 것이 좋다.
public class ReferenceDefault {
... 인스턴스 변수
String instanceVariable;
... 생성자영역
public ReferenceDefault(){}
public ReferenceDefault(String arg){}
... 메소드 영역
public static void main(String[] args){
ReferenceDefault referenceDefault = new ReferenceDefault();
}
public String getString(){
return instanceVariable;
}
public void setString(String str){
instanceVariable = str;
}
...
}
(2) 생성자는 몇 개까지 만들 수 있을까?
자바는 클래스의 객체를 보다 간편하게 만들기 위해서 여러가지 매개변수를 갖는 여러 생성자를 가질 수 있다.
(3) DTO와 VO
DTO는 Data Transfer Object의 약자로, 어떤 속성을 갖는 클래스를 만들고 그 속성들을 쉽게 전달하기 위해 DTO를 만들며 데이터를 다른 서버로 전달하기 위한 것이 주된 목적이다.
VO는 Value Object로, DTO와 형태는 동일하지만 VO는 데이터를 담아 두기 위한 목적으로 사용 된다.
어떻게 보면 DTO와 VO를 포함한다고도 볼 수 있기 때문에 대부분 DTO라는 명칭을 선호한다.
💡 패턴
비슷한 기능을 하는 규칙에 하나의 이름을 정해 놓은 것이라고 보면 된다.
자바의 메소드를 선언할 때 리턴 타입은 한가지만 선언할 수 있다
만약 int 타입이 포함되어 있다면 매우 애매해진다. 이때 DTO를 만들면 타입이 다른 여러개의 데이터를 전달 할 수 있다.
public class MemberDTO {
public String name;
public String phone;
public String email;
public int age;
public int height;
}
public MemberDTO getmethodName() {
MemberDTO dto = new MemberDTO();
return dto;
}
(4) DTO와 생성자를 만들어보자
아래와 같이 생성자를 여러개 선언하고 호출 시 아래와 같이 호출 할 수 있다.
네가지 생성자로 만든 객체들은 서로 다른 속성값을 가지고 있다.
public class MemberDTO {
public String name;
public String phone;
public String email;
public MemberDTO() {
}
public MemberDTO(String name) {
this.name = name;
}
public MemberDTO(String name, String phone) {
this.name = name;
this.phone = phone;
}
public MemberDTO(String name, String phone, String email) {
this.name = name;
this.phone = phone;
this.email = email;
}
...
}
public class YourClass {
public MemberDTO makeMemberObject() {
MemberDTO dto1 = new MemberDTO();
MemberDTO dto2 = new MemberDTO("박도비");
MemberDTO dto3 = new MemberDTO("박도비", "01012345678");
MemberDTO dto4 = new MemberDTO("박도비", "01012345678", "qkrehql@naver.com");
...
return dto;
}
- dto1: 아무런 속성값도 설정된 것이 없기 때문에 모든 문자열의 값이 지정되어 있지 않다. (모두 null)
- dto2 : 이름만 지정되어 있다. (전화번호, 이메일 null)
- dto3 : 이름과 전화번호만 지정되어 있다. (이메일 null)
- dto4 : 모든 속성값이 지정되어 있다.
(5) this
" 이 객체 " 라는 의미를 가지고 있으며 매개변수와 인스턴스 변수의 이름을 다르게 하여 혼동을 하지 않도록 해준다.
즉 this 예약어를 사용하는 것은 매개 변수 안에 있는 것이 아닌 " 이 객체의 변수 " 라고 지정해주는 것이다.
(5) 메소드 오버로딩 (overloading)
생성자처럼 메소드도 이름은 같고 매개변수들은 다르게 하여 선언할 수 있다.
public class ReferenceOberloading {
public static void main(String args[]){
ReferenceOberloading reference = new ReferenceOberloading();
}
public void print(int data) {}
public void print(String data) {}
public void print(int data, String str) {}
public void print(String str, int data) {}
}
위 예시는 메소드 이름은 모두 동일하지만 매개변수의 종류와 개수, 순서가 모두 다르다.
이와 같이 개수가 같아도 타입의 순서가 다르면 다른 메소드처럼 인식된다.
메소드 이름을 같도록 하고, 매개변수만을 다르게 하는 것을 바로 오버로딩이라고 한다.
(6) 메소드 수행 및 종료
자바에서 메소드가 종료되는 조건은 다음과 같다.
- 메소드의 모든 문장이 실행되었을 때
- return 문장에 도달 했을때
- 예외가 발생(throw) 했을 때
모든 기본자료형과 참조자료형 중 하나를 리턴할 수 있으며 리턴하기 위해서는 return을 사용해야한다.
만약 return 타입 뒤에 다른 코드가 있다면 “unreachable statement”라는 메시지와 함께 컴파일 에러가 발생한다.
즉, 리턴 문자 이후에는 어떤 문장도 있으면 안된다.
void라는 것은 " 이 메소드는 아무것도 돌려주지 않습니다." 라는 의미라고 생각하면된다.
또한 void 메소드에서 더 이상 실행하고 싶지 않을 떄에는 reurn 뒤에 바로 세미콜론(;)을 적으면 종료할 수 있다.
return ;
+ if문에서는 return이 하나의 메소드내에 두개 이상이 있어야한다.
(7) static메스도와 일반 메소드의 차이
static은 객체를 생성하지 않아도 메소드를 호출 할 수 있는 마법의 메소드이다.
하지만 static으로 선언한 메소드는 클래스 변수만 사용할 수 있는 단점이 있다.
하지만 static으로 모두 클래스 변수 만드는 메소드에 붙이면 되는거 아니야? 라고 생각할 수 있지만 위험한 이유가 있다.
public class ExClass {
static String name;
public ExClass(){}
public ExClass(String name){
this.name = name;
}
public static void main(String args[]){
ExClass ex = new ExClass();
ex.checkName();
}
public void checkName(){
ExClass ex1 = new ExClass("박도비");
System.out.println(ex1.name); // 박도비 출력
ExClass ex2 = new ExClass("도비박");
System.out.println(ex1.name); // 도비박 출력
}
}
System.out.println(ex1.name) 출력했는데 둘다 박도비가 두번 출력되지 않는다.
이 이유는 name 변수가 인스턴스 변수가 아닌 static으로 선선한 클래스 변수이기 때문이다.
(7) static 블록
객체는 여러 개 생성하지만 한 번만 호출되어야 하는 코드가 있다면 static 블록을 사용하면 된다.
static {
// 딱 한번만 수행되는 코드
}
static 블록은 객체가 생성되기 전에 한번만 호출되고, 그 이후에는 호출하려고 해도 호출 할 수 없다.
그리고 클래스 내에 선언되어 있어야하며 메소드 내에서는 선언할 수가 없다.
(8) Pass by Value, Pass by Reference
pass by Value 값을 전달한다라는 의미로 메소드의 매개 변수로 넘길 때에는 원래 값은 놔두고 전달되는 값이 진짜인 것처럼 보이게 한다. 그래서 매개변수를 받은 메소드에서 그 값을 어떻게 지지고 볶던 간에 원래의 값은 변하지 않는다.
기본 자료형은 무조건 pass by Value 로 참조 자료형은 pass by Reference로 데이터를 전달 해야한다.
public void callPassByValue() {
int a = 10;
String b = "b";
System.out.println(a, b); // 10, b 출력
passByValue(a,b);
System.out.println(a, b); // 10, b 출력
}
public void passByValue(int a, String b) {
a = 20;
b = "z"; // b = new String("z")와 같은 의미
System.out.println(a, b); // 20, z 출력
}
passbyValue는 위에 코드와 같이 값을 그대로 전달하는 역혁을 하지만 passbyReference 로 값을 전달하면
호출한 메소드의 데이터에도 영향이 있다.
- 모든 기본 자료형은 Pass by Value이다.
- 참조 자료형은 값이 아닌 참조가 전달되는 Pass by Reference이다.
( 이게 무슨소리지 ...🙄 라고 할지말고 모르겠으면 외우자 !)
(9) 매개변수를 지정하는 특이한 방법
만약 매개변수의 개수가 정확하게 정해져있지 않은 경우에는 배열로 넘겨주는 방법이 있는데,
"타입...변수명" 으로 선언해주면 해당 변수는 배열로 인식하고 처리가 가능하다.
하지만 하나의 메소드에서는 한번만 사용 가능하고 여러 매개 변수가 있다면 가장 마지막에 선언해야만 한다.
public void arbirary(String messag, int...numbers) {
// 사용 가능 !
}
public void arbirary(int ... numbers, String messag) {
// 사용 불가 !
}
정리해보자.
책에 있는 질문에 대한 나의 정답을 적은 것이다.
'ON > 개발지식' 카테고리의 다른 글
[책리뷰] 자바의 신 3판 - 10장. 자바는 상속이라는 것이 있어요 (0) | 2023.12.14 |
---|---|
[책리뷰] 자바의 신 3판 - 9장. 자바를 배우면 패키지와 접근 제어자는 꼭 알아야 해요 (0) | 2023.12.12 |
[책리뷰] 자바의 신 3판 - 7장. 여러 데이터를 하나에 넣을 수는 없을까요? (0) | 2023.12.08 |
[책리뷰] 자바의 신 3판 - 6장. 제가 조건을 좀 따져요 (1) | 2023.12.07 |
[책리뷰] 자바의 신 3판 - 5장.계산을 하고 싶어요 (1) | 2023.12.05 |