getter/setter 사용의 이유를 코드를 통해 이해하자 (+this. 까지)

하히호호·2024년 4월 4일
0

캡슐화(Encapsulation)에 대해 정리를 하면서 접근 제한자에 대해 공부했다. 접근 제한자, 4가지에 대해 배웠다.
OOP 캡슐화 정리

가장 마지막에 등장한 pravite는 같은 클래스가 아닌 곳에서는 찾을 수 없는데 이는 은닉화와 관력이 있었다.

정보 은닉
객체 내부의 정보에 대하여 외부에서 임의로 변경하거나 접근하는 것을 막는 행위

자동차 클래스가 있다고 가정해보자.

package pack1;

public class Car {
	private int speed;
	public String irum;
	private double weight;

	public Car() { //생성자 (초기화 담당)
		irum = "홍길동";
		speed = 10;
	}

	public void showData() { //메서드
		System.out.println("이름은 " + irum + ", 속도는 " + speed);
	}
}

위와 같은 코드에서 speed는 같은 클래스 안에서만 사용이 가능하다. 즉, 다른 클래스에서 정의한 main 메서드에서는 speed라는 멤버 변수는 찾을 수 없다.

main 메서드를 만들고 실행해보자.

package pack1;

public class CarMain {

	public static void main(String[] args) {
		//Car 객체를 만들기
		Car tom = new Car();
        //tom 객체변수를 통해 speed 불러오기
        System.out.println(tom.speed);
	}
}

에러 메시지
Unresolved compilation problem:
The field Car.speed is not visible

private로 은닉화된 변수 speed는 다른 클래스인 main변수에서 사용할 수 없다.

외부 클래스에서 private 불러오는 방법

private 멤버 변수를 사용하는 public한 클래스를 만들어 주면 된다!

package pack1;

public class Car {
	private int speed;
	public String irum;
	private double weight;

	public Car() { //생성자 (초기화 담당)
		irum = "홍길동";
		speed = 10;
	}

	public void showData() { //메서드
		System.out.println("이름은 " + irum + ", 속도는 " + speed);
	}
    
    public void abcd(int s) { // private 멤버값을 외부에서 접근하기 위한 메소드
		speed = s;
	}
}

이렇게 Car 클래스에 public을 사용하여 speed에 접근할 수 있도록 해주면 main에서 가져올 수 있다.

package pack1;

public class CarMain {

	public static void main(String[] args) {
		//Car 객체를 만들기
		Car tom = new Car();
        tom.abcd(20);
        tom.showData();
	}
}

결과
이름은 홍길동, 속도는 20

이렇게 외부에서 접근할때, 비밀번호를 줄 수 있다.

getter와 setter

위처럼 그냥 클래스에서 메서드를 만들 수 있다. 하지만 이렇게 된다면 일관성있는 값에 접근하는 메서드명을 지칭하는데 혼란을 줄 수도 있다.

이에 따라 특정 값을 메서드를 통해 접근하여 값을 넣어줄때(setter)와 값을 받아올때(getter)일관된 메서드명을 사용할 것이다.

getter와 setter를 사용한다면 자동화가 된다다는 장점이 있다.

(우리는 위에 정의한 abcd 메서드를 getter와 setter로 정의할 것이다.)

package pack1;

public class Car {
	private int speed;
	public String irum;
	private double weight;

	public Car() { //생성자 (초기화 담당)
		irum = "홍길동";
		speed = 10;
	}

	public void showData() { //메서드
		System.out.println("이름은 " + irum + ", 속도는 " + speed);
	}
    
//    public void abcd(int s) { // private 멤버값을 외부에서 접근하기 위한 메소드
//		speed = s;
//	}

	public void setSpeed(int s) {
		speed = s; 
		//return; //생략 가능
	}
	public int getSpeed() { 
		return speed;
	}

}

위와 같이

  • setter
    setter는 초기화를 시켜주는 메서드이다.
    main에서 받은 변수를 멤버변수에 초기화를 시켜주는 역할을 한다.
    setter는 보통 변환해주는 클래스가 아니기에 void로 선언이된다. 때문에 return을 생략할 수 있다.

  • getter
    초기화된 멤버변수 speed가 getter을 통해서 main으로 나간다.


this.

바로 위의 코드를 보면 setter의 매개변수를 보자.
int s를 파라미터로 가져온다. 이 파라미터는 해당 메서드에서 내에서만 사용되는 지역변수이다.
즉, 이 변수 자체는 클래스의 멤버 변수와는 관계가 없다.

public void setSpeed(int s) {
		speed = s; 
		//return; //생략 가능
}

위의 값에서 setter 코드만 가져왔다.
이 경우 Java는 speed 변수를 setSpeed 메서드 내부에서 찾는다. 내부에 원하는 변수를 찾지 못하면 그 다음으로 멤버 변수를 찾는다.

하지만 개발자 잘 알아보기 위해서 매개변수를 해당 클래스의 멤버 변수와 동일한 명칭을 사용할때가 있다.

public void setSpeed(int speed) {
		speed = speed; 
}

이와 같은 경우, java는 내부에 speed라는 변수가 있기에 자기 자신에게 값을 넣는 것이다. Java는 구분하기 못하는 것!
즉, 멤버 변수에 초기화기 되지 않는다.
이때 사용하는 키워드가 this.이다.
Java에게 this.변수명으로 붙은 변수는 멤버변수라고 알려주는 것이다.

public void setSpeed(int speed) {
		this.speed = speed; 
}

java가 this를 구분해서 값을 멤버변수에 초기화한다.

profile
읽히는 코드를 짜고싶습니다.

0개의 댓글