본문 바로가기
언어/java

[Java] 6. 클래스 (3) - 8~10

by 젼젼39 2025. 5. 13.

6.8 메소드 선언과 호출

(1) 메소드 선언

    : 객체의 동작을 실행 블록으로 정의하는 것

리턴타입 메소드명 (매개변수, ...) {  // <-- 선언부
	//실행할 코드를 작성...         // <-- 실행 블록
}

    - 리턴 타입 : 메소드가 실행한 후 호출한 곳으로 전달하는 결과값의 타입
                      - 리턴값 없다면 void
                      - 리턴값 있다면 실행블록 내에서 return 지정 필수

   - 메소드명 : 첫문자를 소문자로 시작, 캐멀 스타일로 작성(setSpeed)

    - 매개변수 : 메소드를 호출할 때 전달할 매개값을 받기 위해 사용
                     - 전달할 매개값 없다면 생략 가능

    - 실행 블록 : 메소드 호출 시 실행되는 부분  

 

(2) 메소드 호출

    : 실행 블록을 실제로 실행하는 것

    - 클래스에서 메소드를 선언한 뒤, 호출 전에 객체가 생성되어야 함

    - i) 객체 내부에서의 호출 : 단순히 메소드명으로 호출하면 됨

    - ii) 객체 외부에서의 호출 : 참조 변수나 도트 연산자를 이용해 호출
                                           : 메소드가 매개변수를 가지고 있다면 호출 시 매개변수의 타입, 수에 맞게 매개값 제공해야 함

 

(3) 가변길이 매개변수

int sum(int ... values) {
}

    - 가변길이 매개변수는 메소드 호출 시 매개값을 쉼표로 구분해 개수와 상관없이 제공 가능

int result = sum(1, 2, 3);
int result = sum(1, 2, 3, 4, 5);

    - 매개값들은 배열 항목으로 자동 변환되어 사용됨 == 메소드 호출 시 배열을 매개값으로 전달해도 됨

int result = sum(new int[] {1, 2, 3});

int[] values = {1, 2, 3};
int result = sum(values);

 

(4) return문

    : 메소드의 실행을 강제 종료하고, 호출한 곳으로 돌아간다

    - return 문 이후의 실행문은 실행되지 않음

 

(5) 메소드 오버로딩

    : 메소드 이름은 같되 매개변수의 타입, 개수, 순서가 다른 메소드를 여러 개 선언하는 것

    (+) 다양한 매개값 처리 가능

 

6.9 인스턴스 멤버

    1. 인스턴스 멤버 : 객체에 소속된 멤버  == 객체를 생성해야 사용 가능
    2. 정적 멤버 : 클래스에 소속된 멤버 == 객체 없이도 사용 가능

(1) 인스턴스멤버 선언 및 사용

public class Car{
	//인스턴스 필드 선언
    int gas;
    
    //인스턴스 메소드 선언
    void setSpeed(int speed) { };
}

    - gas, setSpeed()는 인스턴스 멤버임
        == 외부 클래스에서 사용하기 위해서는 Car 객체를 먼저 생성하고 참조변수로 접근해 사용

Car myCar = new Car();
myCar.gas = 10;
myCar.setSpeed(60);

    - gas 필드는 객체바다 따로 존재

    - setSpeed() 메소드는 각 객체마다 존재하지 않고 메소드 영역에 저장, 공유됨

    => 객체에 소속된 =/= 객체에 포함된
    : 객체 없이 사용하지 못하도록!

 

(2) this 키워드

    : 객체 내부에서 인스턴스 멤버에 접근 위해 this 가용 가능

    = 생성자와 메소드의 매개변수명이 인스턴스 멤버인 필드명과 동일한 경우, 인스턴스 필드임을 강조하고자 할 때 this를 사용

 

6.10 정적 멤버

    정적 멤버 : 메소드 영역의 클래스에 고정적으로 위치하는 멤버
                   = 객체를 생성할 필요 없이 클래스를 통해 바로 사용 가능

(1) 정적 멤버 선언

    - 필드와 메소드 모두 정적 멤버가 될 수 있음; static 키워드 추가하면 됨!

public class 클래스{
	//정적 필드 선언
    static 타입 필드 [= 초기값];
    
    //정적 메소드
    static 리턴타입 메소드(매개변수, ...) {...}; 
}

    - 객체마다 가지고 있을 필요가 없는 공용적인 필드를 정적 필드로 선언 (예: 파이의 값)

    - 인스턴스 필드를 이용하지 않는 메소드는 정적 메소드로 선언
        (예: 인스턴스 필드 color를 변경하는 메소드는 인스턴스 메소드로,
                외부에서 주어진 매개값들을 처리하는 plus() 메소드는 정적 메소드로)

(2) 정적 멤버 사용

    - 클래스가 메모리로 로딩되면 정적 멤버 바로 사용 가능; 클래스 이름과 같이 . 연산자로 접근

public class Calculator{
	static double pi = 3.14;
    static int plus(int x, int y) {...}
}

double result1 = 10*10*Calculator.pi;
int result2 = Calculator.plus(10, 5);

    - 객체 참조 변수로도 접근 가능; 객체를 만들고 도트 연산자로 접근 가능

 

(3) 정적 블록

    - 정적 필드는 필드 선언과 동시에 초기값을 주는 것이 일반적

    - 복잡한 초기화 작업이 필요하다면 정적 블록 이용; 메모리로 로딩될 때 자동으로 순서대로 실행됨

static {

}

 

(4) 인스턴스 멤버 사용 불가

    - 정적 메소드, 정적 블록은 객체가 없어도 실행되기 때문에 내부에 인스턴스 필드, 메소드, 객체 자신의 참조 this를 사용할 수 없음

    = 정적 메소드, 정적 블록에서 인스턴스 멤버 사용하고 싶다면 --> 객체를 먼저 생성하고, 참조 변수로 접근

    - main() 메소드도 정적 메소드이므로 객체 생성 없이 인스턴스 필드, 메소드를 바로 사용할 수 없음

@

 

'언어 > java' 카테고리의 다른 글

[Java] 6. 클래스 (5) - 13~15  (0) 2025.05.14
[Java] 6. 클래스 (4) - 11~12  (0) 2025.05.13
[Java] 6. 클래스 (2) - 5~7  (0) 2025.03.22
[Java] 6. 클래스 (1) 1~4  (0) 2025.03.22
[Java] 5. 참조 타입 (3) - 7~10  (2) 2025.03.16