# 스코프와 this
#### CODE <a class='btn btn-default' href='/codes/26967'>Link</a>
```
public class CoffeeTest {
public static void main(String[] args) {
// 커피 객체 생성
Coffee americano = new Coffee("아메리카노", 1500);
System.out.printf("커피값 인상 전 => %s\n", americano.toString());
// 커피 값 인상: 1500 -> 1800
americano.setPrice(1800);
System.out.printf("커피값 인상 후 => %s\n", americano.toString());
}
}
class Coffee {
// 필드(인스턴스 변수)
private String name;
private int price;
// 생성자
public Coffee(String name, int price) {
/* 1. this 키워드를 사용하여 필드를 초기화하세요.*/
this.name = name;
this.price = price;
}
// 세터
public void setPrice(int price) {
/* 2. this 키워드를 사용하여 필드를 변경하세요.*/
this.price = price;
}
// 메소드
public String toString() {
return String.format("Coffee { name: %s, price: %d }", name, price);
}
}
```
#### INPUT
```
```
#### OUPUT
```
커피값 인상 전 => Coffee { name: 아메리카노, price: 1500 }
커피값 인상 후 => Coffee { name: 아메리카노, price: 1800 }
```
게터 세터 배우니까 오히려 헷갈리네용
첫 번째 출력에서 생성자를 쓰면서 커피 클래스를 거치기 때문에 파라미터로 private에 접근하는 것이 가능하고
두 번째 출력에선 커피테스트에서 접근하기 때문에 세터를 활용하는게 맞나요?
goodlife1359님의 답변
생성자를 사용하는 목적은 객체를 만들기 위해서 사용하는 것입니다.
Coffee americano = new Coffee("아메리카노", 1500);
코드가 실행되면 Coffee 클래스에 선언된 생성자가 호출됩니다.
// 생성자
public Coffee(String name, int price) {
this.name = name;
this.price = price;
}
Coffee객체는 name 과 price변수를 갖고있는데 이를 인스턴스 변수라고 합니다.
생성자가 호출되었을때 전달값인 name은 this.name = name에 의해서 Coffee 객체 안에 존재하는 인스턴스 변수인 name 에 값이 저장됩니다.
마찬가지로 전달값인 price도 this.price = price에 의해서 Coffee 객체 안에 존재하는 인스턴스 변수인 price 에 값이 저장됩니다.
this가 가리키는것은 new Coffee("아메리카노", 1500) 객체를 가리킵니다.
this.name은 Coffee 객체 안에 존재하는 인스턴스 변수 name을 의미하고 this.price는 Coffee 객체 안에 존재하는 인스턴스 변수 price를 의미합니다.
즉 this.name = name 과 this.price = price 에 의해 Coffee 객체 안에 있는 인스턴스 변수인 name과 price에 값이 저장되는것 입니다.
이 문제에서 생성자를 사용한 이유는 name과 price 변수에 private이 붙어있기 때문에
americano.name = "아메리카노";
americano.price = "1500";
이런식으로 직접 변수에 접근할수 없기때문에 생성자를 통해 Coffee객체 안에 있는 인스턴스 변수에 접근해서 값을 넣어준것 입니다.
private의 목적
현재 Coffee클래스에 선언된 name과 price변수에 private 접근제한자가 붙어있습니다.
private을 사용하는 목적은 name과 price변수에 직접 접근하는 것을 막기 위해 사용합니다.
private이 붙었을때 변수를 우회해서 접근하기위해 getter와 setter메소드를 사용해야 합니다.
// 커피 객체 생성
Coffee americano = new Coffee("아메리카노", 1500);
// 커피 값 인상: 1500 -> 1800
americano.setPrice(1800);
name은 아메리카노 이고 price는 1500인 Coffee객체가 만들어졌습니다.
그런데 커피 값을 1800원으로 인상하려고 합니다.
americano.price = 1800; 이렇게 해서 price의 값을 바꾸고 실행하면 오류가 발생합나다.
왜냐하면 price변수에 private이 붙었기 때문에 price 변수에 직접 접근할수 없기때문에 오류가 발생합니다.
price변수에 직접 접근할수 없기때문에 americano.setPrice(1800) 메소드를 호출해서 파라미터로 1800을 넘긴것 입니다.
// 커피 값 인상: 1500 -> 1800
americano.setPrice(1800);
// 세터
public void setPrice(int price) {
this.price = price;
}
정리하면 인스턴스 변수에 private이 붙었는데 값을 변경하고자 할때 해당 변수에 직접 접근할수 없기때문에 set메소드를 호출해서 해당 변수에 접근한것 입니다.
soundnine님의 답변
와.. 답변 엄청나네요 좋아요 백만개 드립니다
sehongpark님의 답변
# private 필드는,
외부에서 사용할 수 없습니다.
## 생성자의 경우,
접근이 가능합니다. 단, 질문 내용을 명확히 할 필요가 있습니다.
> 생성자를 쓰면서 커피 클래스를 거치기 때문에
> ~~파라미터로~~ private에 접근하는 것이 가능하고
생성자는 클래스 내부여서 private 필드에 접근 가능합니다. 단, **this**를 통해 접근 가능하다는 표현이 더 명확합니다.
## 게터와 세터는,
클래스 외부에서 우회하는 방법으로 private필드에 접근하 수 있습니다.
## PS.
질문 감사합니다.