quilt code

[Java] 클래스 (2) 본문

daily/Java

[Java] 클래스 (2)

김뱅쇼 2023. 1. 3. 20:52

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