본문 바로가기
객체지향 OOP

[자바의정석 기초 객체지향 개념] 메서드

by bzerome240 2022. 5. 29.

메서드란?

1 문장들을 묶어 놓은 것

2 값(입력)을 받아서 처리하고 결과를 반환 하는 것

  • 장점: 중복 코드 제거, 관리 용이, 재사용 가능

 

return문

반환타입 void 메소드가 아닌 경우 return 문옆에 반환값이 없으면 에러 발생

// 정상
int max(int a, int b) {
    if(a > b)
        return a;
    else
        return b;
}

// 에러
int max(int a, int b) {
    if(a > b)
}

 


 

스택: 밑이 막힌 상자, 위에 쌓인다.

 

호출 스택 call stack

: 메서드 수행에 필요한 메모리가 제공되는 공간

 

메서드가 호출되면 호출 스택에 메모리 할당, 종료되면 메모리 해제

 

호출 스택 변화 예제

 

 


 

기본형 매개변수 VS 참조형 매개변수

기본형 매개변수 - read only

참조형 매개변수 - read & write

 

참조형 매개변수 예제

객체의 주소를 넘겨주기 때문에 쓰기가 가능하다.

 

참조형 반환타입 예제

객체의 주소를 반환한다.

 

 


 

static 메서드 VS 인스턴스 메서드

인스턴스 메서드

  • 인스턴스 생성 후 참조변수.메서드이름() 으로 호출
  • 메서드 내에서 인스턴스 변수, 인스턴스 메서드 사용 가능

static 메서드 (클래스 메서드)

  • 객체 생성 없이 클래스이름.메서드이름() 으로 호출
  • 메서드 내에서 인스턴스 변수, 인스턴스 메서드 사용 불가 → 에러 발생

 

호출 예제

class My {
	long a, b; // 인스턴스 변수

	// 인스턴스 메서드
	long add() {
		return a+b; // 인스턴스 변수
	}

	// static 메서드
	static long add(long a, long b) { // 지역 변수
		return a+b; // 지역 변수
	}
}

class Test {
	public static void main(String args()) {
		// static 클래스 메서드 호출
		System.out.println(My.add(200L, 100L));

		// 인스턴스 생성
		My mm = new My();
		mm.a = 200L;
		mm.b = 100L;
		// 인스턴스 메서드 호출
		System.out.println(mm.add());
	}
}
💡 stiatic 메서드는 ‘객체 생성 없이 호출 가능 하다’ 라고 만 아는 경우가 많은데
나아가 언제 static을 붙여야 하는지 생각할 줄 알아야 한다.
static은 인스턴스 변수를 사용하지 않을 때 붙인다.

 

 

static을 언제 붙여야 할까?

  • 멤버 변수 중에서 공통 속성에 static을 붙인다
    • ex)
    class Card {
    	String kind; // 무늬
    	int number; // 술자
    
    	static int width = 100; // 폭
    	static int height = 250; // 높이
    }
    
  • 인스턴스 멤버를 사용하지 않는 메서드에 static을 붙인다.
    • ex)
    class My {
    	long a, b;
    
    	long add() { return a+b; }
    
    	static long add(long a, long b) { return a+b; }
    }
    

 

생성자

: 인스턴스가 생성될 때마다 호출되는 ‘인스턴스 초기화 메서드’

  • 초기화를 편리하게 할 수 있다.
  • 생성자 이름이 클래스 이름과 같아야 한다.
  • 리턴값이 없다.
  • 모든 클래스는 반드시 생성자를 가져야 한다.

 

기본 생성자

생성자가 하나도 없을 때는 컴파일러가 기본 생성자 자동 추가되지만, 코드 작성 시 기본 생성자를 만들어주면 좋다.

 

생성자 예제

class Card {
	// 기본 생성자
	Card() {
		// 인스턴스 초기화
	}

	// 매개변수가 있는 생성자
	Card(String kind, int number) {
		// 인스턴스 초기화
	}
}

// 생성자 호출
Card c = new Card(); 
Card c2 = new Card("white", 4);

 

생성자 this()

  • 생성자에서 다른 생성자 호출할 때 사용
  • 다른 생성자 호출 시 첫 줄에서만 사용 가능

 

this() 예제

this()를 사용하므로 코드의 중복을 제거할 수 있다.

class Card {
	String color;
	int door;

	Card() {
		this("white", 0); // Card X this O
	}

	Card(String kind, int number) {
		color = kind;
		door = number 
	}
}

 

참조변수 this

: 인스턴스 자신을 가리키는 참조변수

  • 인스턴스 메서드에서 사용가능
  • 지역변수와 인스턴스 변수를 구별할 때 사용

 

this 참조변수 예제

이름이 같은 경우 구분해야 한다.

	Card(String kind, int number) {
		this.kind = kind;
		this.number = number 
	}

 

변수의 초기화

  • 지역변수는 사용 전 꼭!! 수동 초기화 해야함
  • 멤버변수는 자동 초기화된다.
class Test {
	int x;
	int y = x;

	void method() {
		int i;
		int j = i; // 지역변수는 초기화 안해주면 에러 발생!
}

 

멤버변수의 초기화

  1. 명시적 초기화 (대입연산자 =)
    1. int a = 4;
  2. 초기화 블럭
    1. 인스턴스 초기화 블럭 : {}
    2. 클래스 초기화 블럭 : static {}
  3. 생성자
Car(String a, int b) { this.aa = a; this bb = b; }

 

변수 초기화 시점

  • 클래스 변수 - 클래스가 처음 로딩될 때 단 한번 (메모리에 올라갈 때)
  • 인스턴스 변수 - 인스턴스가 생성될 때 마다
728x90
반응형

댓글