728x90
학습 목표
- 참조 자료형의 생성자와 메서드
- call by value & call by Reference
학습 결과 요약
- 참조 자료형의 생성자는 만들어 주지 않으면 컴파일 시 자동 생성된다. 단 매개변수가 있는 생성자가 하나도 없을 경우에.
- 메서드 오버로딩은 같은 역할을 하는 메서드는 같은 이름을 가져야한다는 모토에서 시작되었으며 매개 변수의 타입과 순서만 다르면 같은 이름의 메서드를 여러개 만들 수 있다.
- pass by value 는 복제된 값이 넘겨져서 넘겨받은 메서드에서 무슨짓을 해도 원래 값은 변하지 않는다.
- pass by reference 는 객체의 주소값이 넘겨져서 넘겨 받은 메서드에서 변경을 하면 그대로 데이터가 바뀐다.
- static 메서드는 클래스에 고정된 멤버로서 객체를 초기화하지 않아도 사용 가능하다. 클래스가 로딩될 때 로딩된다. 초기화 작업은 static block 통해 가능하다. 최초 한 번만 실행된다.
학습 내용
참조 자료형
- 자바에서 기본 자료형을 제외한 모든 자료형은 참조 자료형이다
- 참조 자료형이 사용할 수 있는 자료형은 오직 = 연산 하나다.
기본 생성자
class Apple {
String name;
}
public static void main(String[] args){
Apple apple = new Apple();
}
- 객체 생성할 때 new 뒤에 클래스 이름과 동일하고() 소괄호로 끝나는 것이 기본 생성자다.
- 생성자 : 자바 클래스의 객체를 생성하기 위해 존재한다. 생성자의 리턴 타입은 클래스의 객체기 때문이며, 클래스와 이름이 동일해야 컴파일러가 알아 차릴 수 있다.
- 클래스에 생성자를 만들어 주지 않아도 컴파일 시 자동으로 만들어 준다. 단, 다른 생성자가 없을 경우에만.
- 하나의 클래스에 생성자를 여러개 만들 수 있는데, 그 목적은 상황에 맞는 생성자를 사용하도록 함이다. → 꼭 필요한 생성자만 만드는 습관을 갖자.
class Member {
String name;
String phone;
String address;
int age;
Member(String name){
this.name = name;
}
Member(String name, String phone){
this.name = name;
this.phone = phone;
}
Member(String name, String phone, String address){
this.name = name;
this.phone = phone;
this.address = address;
}
}
this
- 객체의 변수와 매개 변수의 이름이 동일할 때, 인스턴스 변수를 구분하기 위해 사용
- 생성자와 메서드 안에서 사용할 수 있다.
메서드 오버로딩
- 메서드 이름은 같고 매개 변수들을 다르게 해 여러개 만들 수 있다.
- 조건은 매개 변수의 순서와 타입이 달라야 한다.
- 메서드 오버로딩은 같은 역할을 하는 메서드는 같은 이름을 가져야 한다는 모토로 사용한다. 위 예시 코드에서 매개 변수를 무엇을 받던 두 메서드의 역할은 출력이다.
메서드에서 값 넘겨주기
- 자바에서는 모든 타입을 한 개만 리턴 타입으로 넘겨줄 수 있다.
- 메서드가 종료되는 조건
- 메서드의 모든 문장이 실행되었을 때
- return 문장에 도달했을 때
- 예외가 발생했을 때
static 메서드 일반 메서드 차이
- static method는 클래스에 고정된 멤버로서 객체를 생성하지 않아도 사용할 수 있다.
- Static method는 클래스 변수만 사용 가능하다. → 객체가 없어도 실행되기 때문에 인스턴스 변수나 메서드에는 접근이 애초에 불가능함
- 로딩 시점
- 클래스 로더가 클래스를 로딩해서 method area 영역에 적재할 때 → 클래스의 로딩이 끝나면 바로 사용 가능
- 초기화 작업
- non-static method : 생성자에서 한다.
- static method : 객체를 생성하지 않고 사용하는 메서드이므로 static block 을 제공한다. 클래스가 메모리로 로딩될 때 자동적으로 실행된다.
- 인스턴스 변수 & 클래스 변수 선택공용적인 데이터라면 정적 필드로 선언하는 것이 좋음
- 객체마다 가지고 있어야 할 데이터라면 인스턴스 필드로 선언.
- 인스턴스 메서드 & 정적 메서드 선택인스턴스 필드를 이용하지 않는다면 정적 메소드로 선언
- 인스턴스 필드를 이용해서 실행해야 한다면 인스턴스 메소드로 선언
pass by value, pass by reference
- 메서드의 매개 변수가 전달될 때 변수가 기본 자료형이냐 참조 자료형이냐에 따라 차이가 있다.
- 기본 자료형 : 기본 자료형은 원래의 값은 놔두고 복제된 값이 전달된다.
public static void main(String[] args) { ReferencePass ref = new ReferencePass(); ref.callPassByValue(); } private void callPassByValue() { int a = 10; String b = "b"; System.out.println("a= " + a); System.out.println("b= " + b); passByValue(a, b); System.out.println("a= " + a); System.out.println("b= " + b); } private void passByValue(int a, String b) { a = 20; b = "z"; }
before passByValue a= 10 b= b in passByValue a= 20 b= z after passByValue a= 10 b= b
- 그래서 passByValue() 안에서 무슨 일이 벌어져도 callPassByValue에서 선언된 int a 의 값은 변하지 않는다.
- 참조 자료형 : 참조 자료형은 객체의 주소값이 전달되는 점에 유의해야 한다.
- 두 메서드의 변수 dto 는 메모리의 같은 객체를 참조하고 있다. 그래서 호출된 메서드에서 변경한 대로 데이터가 바뀐다.
- 기본 자료형 : 기본 자료형은 원래의 값은 놔두고 복제된 값이 전달된다.
public static void main(String[] args) {
ReferencePass ref = new ReferencePass();
ref.callPassByReference();
}
private void passByRef(MemberDto dto) {
dto.name = "Ronaldo";
System.out.println("in PassByRef");
System.out.println("dto.name = " + dto.name);
}
private void passByValue(int a, String b) {
a = 20;
b = "z";
System.out.println("in passByValue");
System.out.println("a= " + a);
System.out.println("b= " + b);
}
before passByRef
dto.name = Messi
in PassByRef
dto.name = Ronaldo
before passByRef
dto.name = Ronaldo
728x90
'Programming > Java' 카테고리의 다른 글
[F-Lab 모각코 챌린지 10일차] TIL : 자바의신 10장 (0) | 2023.06.12 |
---|---|
[F-Lab 모각코 챌린지 9일차] TIL : 자바의신 9장 (0) | 2023.06.11 |
[F-Lab 모각코 챌린지 7일차] TIL : hashCode, 자바의신 7장 (0) | 2023.06.09 |
[F-Lab 모각코 챌린지 6일차] : TIL (0) | 2023.06.08 |
[F-lab 모각코 챌린지 5일차] java : ==, equals() (0) | 2023.06.07 |
댓글