[Java - OOP 기초2] 필드와 메서드
👩💻변수
클래스 변수 / 인스턴스 변수 / 지역 변수
(=멤버변수, 필드) 메서드 내에 포함된 모든 변수
✨클래스 변수, 인스턴스 변수 차이점 : static 이 있으면 클래스 변수, static이 없으면 인스턴스 변수
class Example { // => 클래스 영역
int instanceVariable; // 인스턴스 변수
static int classVariable; // 클래스 변수(static 변수, 공유변수)
void method() { // => 메서드 영역
int localVariable = 0; // 지역 변수. {}블록 안에서만 유효
}
}
인스턴스 변수 : new 로 생성됨, 각각의 고유한 속성
클래스 변수 : static 키워드로 선언됨, 공통된 저장공간 공유
손가락 수(5), 발가락 수(5) 같이 모든 사람이 공유하는 특성? → 클래스 변수(static) 선언
인스턴스 변수 : 선언하지 않고도 클래스명.클래스변수명 으로 사용 가능
↕️ 차이점 : 초기값(필드 변수 - 강제로 초기화 이뤄짐, 지역변수 - 초기화 필수)
지역변수 : 메서드 내에 선언, 스택 메모리에 저장 (메서드 종료와 함께 소멸)
✨Static? : 모든 객체와 메모리를 공유
- 인스턴스, 클래스 변수 구분점
- 클래스 멤버(필드, 메서드, 이너클래스)에 사용 가능 (정적멤버)
- 인스턴스 생성 없이도 클래스명.멤버명 으로 사용 가능
- 객체 생성 이후 참조변수 통해 사용 가능, but ‘정적 멤버’ 표시 위해 클래스.멤버명 권장
- 정적 필드는 객체간 공유 변수의 성질이 있음 - 모든 인스턴스에 공통적용 값 공유
- 정적 메서드의 경우 인스턴스 변수, 인스턴스 메서드 사용 불가 (인스턴스 생성 없이 호출 가능하기 때문에)
✨메서드 : 특정 작업을 수행하는 일련의 명령문들의 집합
자바제어자 반환타입 메서드명 매개변수
public static int add(int x, int y) { // 메서드 시그니처
int result = x + y; // 메서드 바디
return result;
}
메서드 시그니처와 메서드 바디로 이루어져 있다.
반환 타입 : 메서드가 어떤 타입을 반환하는지
메서드명 : 메서드 이름
매개변수 : 작업을 수행하기 위해 어떤 재료들이 필요한지
- 반환타입이 void 가 아닌경우 메서드내 return문 필수
- 결과값 : 반환타입과 일치, 자동형변환 가능한 것
✨메서드 호출 : 클래스 외부에서 메서드 사용시 인스턴스 생성 해야함
인스턴스 생성 후 : ‘.’ 포인트 연산자 통해 메서드 호출 가능
인자 : 메서드 호출 시 괄호 안에 넣어주는 입력값
ex)
Double multiply(int x, double y) { // 매개변수가 있는 메서드
double result = x * y;
return result;
}
Double multiply(4, 4.0);
인자의 갯수와 순서 : 메서드 정의시 선언된 매개변수와 일치해야 함
✨메서드 오버로딩 : 하나의 클래스 안에 같은 이름의 메서드를 여러개 정의하는 것 (!= 오버라이딩)
장점 : 하나의 메서드로 여러 경우의 수를 해결할 수 있다(일일히 메서드 정의 안해도 됨)
오버로딩 성립 조건 :
- 같은 이름의 메서드명 사용
- 매개변수의 개수, 타입 다르게 정의되어야함
- *반환 타입은 오버로딩 성립하는데에 영향 X
ex)
public class Overloading {
public static void main(String[] args) {
Shape s = new Shape(); // 객체 생성
s.area(); // 메서드 호출
s.area(5);
s.area(10,10);
s.area(6.0, 12.0);
}
}
class Shape {
public void area() { // 메서드 오버로딩. 같은 이름의 메서드 4개.
System.out.println("넓이");
}
public void area(int r) {
System.out.println("원 넓이 = " + 3.14 * r * r);
}
public void area(int w, int l) {
System.out.println("직사각형 넓이 = " + w * l);
}
public void area(double b, double h) {
System.out.println("삼각형 넓이 = " + 0.5 * b * h);
}
}
//출력값
넓이
원 넓이 = 78.5
직사각형 넓이 = 100
삼각형 넓이 = 36.0