5.3 메소드
- 객체 동작에 해당하는 이름을 가진 중괄호 {} 블록
- 메소드 호출 시 중괄호 블록에 있는 모든 코드들이 일괄적으로 실행
- 객체 간의 데이터 전달의 수단으로써 사용
- 외부로부터 매개값을 받을 수 있으며 실행 후 어떤 값을 리턴할 수도 있다.
리턴값 = 전자계산기객체.메소드(매개값1, 매개값2, ...)
리턴 타입
- 메소드가 실행 후 리턴하는 값의 타입
- 메소드는 리턴값이 있을 수도, 없을 수도 있다.
메소드 이름
- 숫자로 시작하면 안 되고, $와 _를 제외한 특수 문자를 사용하지 말아야 한다.
- 관례적으로 메소드명은 소문자로 작성한다.
- 서로 다른 단어가 혼합된 이름이라면 뒤이어 오늘 단어의 첫머리 글자는 대문자로 작성한다.
void run() { ... }
void startEngine() { ... }
String getName() { ... }
int[] getScores() { ... }
매개 변수의 수를 모를 경우
- 메소드를 선언할 때 매개 변수의 개수를 알 수 없는 경우
- 여러 개의 수를 모두 합산하는 메소드를 선언한다면, 매개변수를 배열타입으로 선언
int sum(int[] values) { ... }
메소드 호출
- 메소드는 클래스 내,외부의 호출에 의해 실행
- 클래스 내부의 다른 메소드에서 호출할 경우, 단순한 메소드 이름으로 호출
- 외부에서 호출할 경우, 우선 클래스 생성 뒤, 참조 변수를 이용해 메소드를 호출
- 객체가 존재해야 메소드도 존재하기 때문
메소드 오버로딩(Overloading)
- 클래스 내에 같은 이름의 메소드를 여러 개 선언하는 것
- 하나의 이름으로 여러 기능을 담는다.
- 매개 변수의 타입, 개수, 순서 중 하나가 달라야 한다.
메소드 오버로딩의 가장 대표적인 예
- System.out.println()
호출할 때 주어진 매개값의 타입에 따라 오버로딩된 println() 메소드를 호출
6. 인스턴스 멤버와 this
- 인스턴스(instance)멤버란?
- 객체(인스턴스)를 생성한 후 사용할 수 있는 필드와 메소드
- 인스턴스 필드, 인스턴스 메소드
- 객체에 소속된 멤버이므로 객체 없이 사용할 수 없음.
- 인스턴스 필드 gas는 객체마다 따로 존재, 인스턴스 메소드 setSpeed()는 메소드 영역에 저장되고 공유
7. 정적 멤버와 static
(static) : ‘고정된’
- 정적 멤버
- 클래스에 고정된 멤버
- 객체를 생성하지 않고 사용할 수 있는 필드와 메소드
- 정적 필드, 정적 메소드
- 객체(인스턴스)에 소속된 멤버가 아니라 클래스에 소속된 멤버이므로 클래스 멤버라고도 부른다.
7.1 정적 멤버 선언
- 정적 필드와 정적 메소드를 선언하는 방법은 필드와 메소드 선언 시 static 키워드를 추가적으로 붙이면 된다.
public class 클래스{
// 정적 필드
static 타입 필드 [= 초기값];
// 정적 메소드
static 리턴 타입 메소드( 매개변수 선언, ... ) { ... }
}
- 정적 필드와 적정 메소드는 클래스에 고정된 멤버이므로 클래스 로더가 클래스(바이트 코드)를 로딩해서 메소드 메모리 영역에 적재할 때 클래스별로 관린된다.
- 클래스의 로딩이 끝나면 바로 사용할 수 있다.
- 필드를 선언할 때 인스턴스 필드로 선언할 것인가, 아니면 정적 필드로 선언할 것인가의 판단 기준
- 객체마다 가지고 있어야 할 데이터라면 인스턴스 필드로 선언
- 객체마다 가지고 있을 필요성이 없는 공용 데이터라면 정적 필드로 선언
7.2 정적 멤버 사용
- 클래스가 메모리로 로딩되면 정적 멤버를 바로 사용할 수 있음
- 클래스 이름과 함께 도트(.) 연산자로 접근
클래스.필드;
클래스.메소드( 매개값, ... );
- 정적 요소는 클래스 이름으로 접근하는 것이 좋다.
- 참조변수로 접근했을 경우 이클립스에서는 경고 표시가 뜸
public class Calculator{ // 정적 필드는 필드 선언과 동시에 초기값을 정해주는 것이 좋다. static double pi = 3.141592; static int plus(int x, int y){ return x + y; } static int minus(int x, int y){ return x-y; }
public class CalculatorExample{ public static void main(String[] args){ double result1 = 10*10*Calculator.pi; } }
7.3 정적 초기화 블록
- 계산이 필요한 초기화 작업이 있을 경우
- 정적 필드의 복잡한 초기화 작업을 위해 정적 블록(static block)을 제공한다.
- 정적 블록은 클래스가 메모리로 로딩될 때 자동적으로 실행된다.
public class Television{
static String company = "Samsung";
static String model = "LCD";
static String info;
**static {
info = company + "-"+ model;
}**
}
7.4 정적 메소드와 블록 선언 시 주의할 점
- 개체가 없어도 실행된다는 특징으로 내부에 인스턴스 필드나 인스턴스 메소드를 사용할 수 없다.
- 객체 자신의 참조인 this키워드도 사용이 불가하다.
public int ClassName{
*// 인스턴스 필드와 메소드*
int field1;
void method1(){ ... }
// 정적 필드와 메소드
static int field2;
static void method2; {...}
// 정적 블록
static{
~~field1 = 10;
method1();~~
field2 = 10;
method2();
}
//정적 메소드
static void Method3{
~~this.field1 = 10; // 컴파일 에러
this.method1();~~
field2 = 10;
method2();
}
}
- 객체 먼저 생성 뒤 접근
static void Method3(){
ClassName obj = new ClassName();
obj.field = 10;
obj.method1();
}
7.5 싱글톤(Singleton)
- 전체 프로그램에서 단 하나의 객체만 만들도록 보장해야 하는 경우
- 단 하나만 생성된다 = > 싱글톤 객체
- 클래스 외부에서 new 연산자로 생성자를 호출할 수 없도록 막아야 한다.
- private 접근 제한자를 붙여주면 된다.
public class 클래스{
// 정적 필드
private static 클래스 singlton = new 클래스();
// 생성자
private 클래스() {}
// 정적 메소드
static 클래스 getInstance(){
return singleton;
}
}
- 외부에서 객체를 얻는 유일한 방법은 getInstance() 메소드 호출
8. final 필드와 상수
8.1. final 필드
- final : 최종적인
final 타입 필드 [= 초기값 ];
- 초기값을 주는 방법
- 필드 선언 시
- 생성자
- 초기화되지 않은 final 필드를 그대로 남겨두면 컴파일 에러가 발생.
8.2 상수(static final)
- 상수 : 불변의 값
- final 필드는 한 번 초기화되면 수정될 수 없는 필드.
- final 필드를 상수라고 부르지 않는 이유?
- 불변의 값은 객체마다 저장할 필요가 없는 공용성을 띠고 있기 때문.
- 여러 가지 값으로 초기화될 수 없기 때문.
- final 필드는 객체마다 저장되고, 생성자의 매개값을 통해 여러 가지 값을 가질 수 있기 때문에 상수가 될 수 없다.
- final 필드를 상수라고 부르지 않는 이유?
- static final 필드는 객체마다 저장되지 않고, 클래스에만 포함된다.
- 한 번 초기값이 저장되면 변경할 수 없다.
public class Earth{
static final double EARTH_RADIUS = 6400;
static final double EARTH_SURFACE_AREA;
static{
EARTH_SURFACE_AREA = 4 * Math.PI * EARTH_RADIUS * EARTH_RADIUS;
}
}
'CS > 이것이 자바다' 카테고리의 다른 글
[CS] 이것이 자바다 - 클래스(3): 패키지, 어노테이션 (1) | 2023.10.04 |
---|---|
[CS] 이것이 자바다 - 클래스(1) - 객체와 클래스 (0) | 2023.09.21 |
[CS] 이것이 자바다 - 참조 타입 (0) | 2023.09.16 |
[CS] 이것이 자바다 - 자바, 변수와 타입 (1) | 2023.08.23 |