quilt code
[Java] 클래스 (2) 본문
3. 생성자
: new 연산자 클래스로부터 객체를 생성할 때 호출되어 객체의 초기화를 담당
**객체 초기화: 필드를 초기화하거나 메소드를 호출해서 객체를 사용할 준비를 하는 것. new 연산자에 의해 생성자가 성공적으로 실행되면 힙Heap 영역에 객체가 생성되고 객체의 번지가 리턴됨
1) 기본 생성자
- 모든 클래스는 생성자가 반드시 존재. 생성자를 하나 이상 가질 수 있음
- 클래스 내부에 생성자 선언을 생략했다면 컴파일러는 중괄호 { } 블록 내용이 비어 있는 기본 생성자 바이트 코드를 자동추가
- [public] 클래스( ) { }
- Car myCar = new Car( ); 기본생성자
2) 생성자 선언
클래스 ( 매개변수선언, ... ) {
}
**매개 변수 선언은 생략할 수도 있고 여러 개를 선언해도 ok. 매개 변수는 new 연산자로 생성자를 호출할 때 외부의 값을 생성자 블록 내부로 전달하는 역할
| 생성자 Car (String color, int cc) { } |
| 생성자 호출 Car myCar = new Car("검정", 3000); (Car myCar = new Car(); -> X 기본생성자 호출 불가) |
3) 필드 초기화
① 필드를 선언할 때 초기값을 주는 방법 (동일한 클래스로부터 생성되는 객체들은 모두 같은 값을 갖게 됨)
② 생성자에서 초기값을 주는 방법
| 필드 String nation = "대한민국"; String name; String ssn; |
| 생성자 public Korean(String n, String s) { name = n; ssn = s; } |
| Korean k1 = new Korean("박자바", "011225-1234567"); Korean k2 = new Korean("김자바", "930525-0654321"); |
>>필드와 매개 변수 이름이 동일->생성자 내부에서 해당 필드에 접근할 수 없음 -> 해결방법: 필드 앞에 this. 붙이기
| public Korea(String name, String ssn) { this.name = name; this.ssn = ssn; >> :필드 :매개변수 |
4) 생성자 오버로딩
: 매개 변수를 달리하는 생성자를 여러 개 선언하는 것
| Car 클래스 public class Car { Car( ) { ... } <<생성자 Car(String model) { ... } Car(String model, String color) { ... } Car(String model, String colot, int maxSpeed) { ... } } |
**주의점: 매개 변수의 타입과 개수, 선언된 순서가 똑같을 경우 매개 변수 이름만 바꾸는 것은 생성자 오버로딩이 아님
| Car 객체 생성 Car car1 = new Car(); <<기본 생성자로 객체 생성 Car car2 = new Car("그랜저"); <<Car(String model) 생성자로 객체 생성 Car car3 = new Car("그랜저", "흰색"); <<Car(String model, String color) 생성자로 객체 생성 Car car4 = new Car("그랜저", "흰색", 300); << Car(String model, String colot, int maxSpeed) 생성자로 객체 생성 |
5) 다른 생성자 호출: this()
- 생성자 오버로딩이 많아질 경우 생성자 간의 중복 코드 발생
- 필드 초기화 내용은 한 생성자에만 집중적으로 작성하고 나머지 생성자는 초기화 내용을 가지고 있는 생성자를 호출하는 방법으로 개선
- this() 코드 사용
| 클래스 ( [매개변수, ...] ) { this( 매개변수, ..., 값, ... ); <<클래스의 다른 생성자 호출 실행문; } |
- this()는 자신의 다른 생성자를 호출하는 코드로 반드시 생성자의 첫 줄에서만 허용
- this()의 매개값은 호출되는 생성자의 매개 변수에 맞게 제공해야함
- 호출되는 생성자의 실행이 끝나면 원래 생성자로 돌아와서 다음 실행문을 진행한다는 뜻
*다른 생성자를 호출해서 중복 코드 줄이기*

4. 메소드
- 객체의 동작에 해당하는 중괄호 { }블록
- 중괄호 블록 이름=메소드 이름
- 메소드를 호출하면 중괄호 블록에 있는 모든 코드들이 일괄 실행됨
| 메소드 선언 | |
| 선언부 :메소드 시그너처 |
실행 |
| 리턴타입 메소드이름 ( [ 매개변수선언, ...] ) { } : 메소드가 리턴하는 결과 타입 표시 : 메소드의 기능이 드러나도록 식별자 규칙에 맞게 이름 짓기 : 메소드가 실행할 때 필요한 데이터를 받기 위한 변수 선언 실행할 코드 작성 |
1) 메소드 선언
① 리턴타입
- 리턴값의 타입
- 리턴값: 메소드를 실행한 후의 결과값
- 리턴값이 있을 경우 리턴 타입이 선언부에 명시되어야함
- 리턴값이 없는 메소드는 리턴 타입에 void로 기술
- 리턴값이 있는 메소드는 리턴값의 타입 기술
| 리턴값이 있는 메소드 | void powerOn() { ... } |
| 리턴값이 없는 메소드 | double divide(int x, int y) { ... } |
*메소드 호출 방법*
| 리턴값이 있는 메소드 | powerOn(); >>단순히 메소드만 호출하면 됨 |
| 리턴값이 없는 메소드 | divide(int x, int y); >>리턴 타입인 double 타입으로 선언 |
**리턴 타입이 있다고 반드시 리턴값을 변수에 저장할 필요 x 메소드 실행이 중요할 경우에는
: divide( 10, 20);
② 메소드 이름
- 숫자로 시작x $와 _를 제외한 특수 문자 사용x
- 관례적으로 메소드 이름은 소문자로 작성
- 서로 다른 단어가 혼합된 이름이라면 뒤이어 오는 단어의 첫 글자는 대문자로 작성
③ 매개 변수 선언
- 메소드가 실행할 때 필요한 데이터를 외부로부터 받기 위해 사용


④ 매개 변수의 개수를 모르는 경우
- 매개 변수를 배열 타입으로 선언
- 배열의 항목 수는 호출할 때 결정
| int sum1(int[] values) { 1, 2, 3 }; int result = sum1(values); int result = sum1(new int[] { 1, 2, 3, 4, 5 }); |
배열을 생성하지 않고 값의 목록만 넘겨주는 방법도 있음 -> 매개 변수를 사용해서 선언 -> 메소드 호출 시 넘겨준 값의 수에 따라 자동으로 배열이 생성되고 매개값으로 사용됨
2) 리턴return문
① 리턴값이 있는 메소드
- 리턴타입이 있는 메소드는 반드시 리턴문을 사용해서 리턴값 지정
- return 리턴값;
② 리턴값이 없는 메소드: void
- 리턴값이 없는 메소드는 리턴 타입으로 void 사용
- void로 선언된 메소드에서도 return문 사용 가능
- return;
- 메소드 실행을 강제로 종료시키는 역할
3) 메소드 호출
① 객체 내부에서 호출: 메소드( 매개값, ... );


② 객체 외부에서 호출: 클래스 참조변수 = new 클래스(매개값, ...);


4) 메소드 오버로딩
: 클래스 내에 같은 이름의 메소드를 여러개 선언하는 것
조건) 매개 변수의 타입, 개수, 순서 중 하나가 달라야 함


3. 메소드 선언


4. 메소드 오버로딩


'daily > Java' 카테고리의 다른 글
| [Java] 클래스 (4) (0) | 2023.01.11 |
|---|---|
| [Java] 클래스 (3) (0) | 2023.01.04 |
| [Java] 클래스(1) (0) | 2023.01.02 |
| [Java] 참조타입 과제 (0) | 2023.01.02 |
| [Java] 열거 타입 (0) | 2022.12.30 |