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 |