공부를 하자!/나도코딩 자바 심화편

[나도코딩 자바 심화편] 2일차: 클래스 메소드, This, 생성자, Getter와 Setter

kimchopchop 2024. 12. 20. 12:09

나도코딩 자바 심화편_2일차(24.12.19)
 

#046 <클래스 메소드>

 // 고객센터 연결 메소드(클래스 메소드)
static void callServiceCenter() {
System.out.println("서비스 센터(1588-0000)로 연결합니다.");
// modelName = "test"; → 인스턴스 변수는 객체가 만들어져야 하기 때문에
    클래스 메소드에서 사용 불가
canAutoReport = false; → static으로 선언한 클래스 변수는 클래스(static) 메소드에서
    바로 사용 가능
}
 
BlackBox b1 = new BlackBox();
b1.callServiceCenter(); → 고객센터 연결 메소드(클래스 메소드) 실행
 
BlackBox b2 = new BlackBox();
b2.callServiceCenter(); → 다른 객체에서도 똑같은 결과
 
BlackBox.callServiceCenter(); → 클래스 변수처럼 클래스 이름으로 직접 접근 가능
 

정리

→ 메소드 내에서 인스턴스 변수를 사용하지 않아도 될 때 클래스 메소드 사용 가능
→ 클래스 메소드는 모든 객체에 공통적으로 적용됨
 

#047 <This>

 BlackBox b1 = new BlackBox();
b1.modelName = "까망이"; → 까망이(최신형) 로 모델명 업데이트
b1.appendModelName("(최신형)"); → 모델명 업데이트(추가)하는 메소드
System.out.println(b1.modelName);
→ 메소드 생성 전에 일단 호출하고 메소드명에서 alt + enter 누르면 자동 생성 기능
→ 메소드명 클릭하고 ctrl + shift + i 누르면 메소드 보기
 
void appendModelName(String modelName) {
this.modelName += modelName;
}
→ 인스턴스 변수와 전달값 변수의 이름이 같으면 this 붙여서 인스턴스 변수 표시해주기
→ this 붙이지 않으면 (최신형) 추가되지 않음
 

#048 <생성자>
*생성자

객체가 만들어질 때 자동으로 호출되는 메소드
 
BlackBox b1 = new BlackBox();
→ 이 객체가 만들어질 때 반드시 수행되는 동작
→ 생성자에는 반환형이 따로 없음
→ 클래스명과 똑같이 적기
→ 클래스에 정의되어 있는 인스턴트 변수들의 값 초기화(설정)
→ 생성자는 보통 변수 목록 다음에 위치함
 
BlackBox(){
System.out.println("기본 생성자 호출");
}
 
BlackBox b1 = new BlackBox(); → 기본 생성자 호출
 
BlackBox b1 = new BlackBox();
b1.modelName = "까망이";
b1.resolution = "FHD";
b1.price = 200000;
b1.color = "블랙";
→ 생성자를 이용하면 이 작업 간편하게 할 수 있음
 
BlackBox(String modelName, String resolution, int price, String color) {
System.out.println("사용자 정의 생성자 호출");
this.modelName = modelName;
this.resolution = resolution;
this.price = price;
this.color = color;
}
→ 메소드 오버로딩처럼 생성자도 같은 이름으로 여러 개 만들 수 있음
 
// 사용자 정의 생성자 호출
BlackBox b2 = new BlackBox("하양이", "UHD", 300000, "화이트");
→ 한 줄로 모든 값 넣을 수 있음
System.out.println(b2.modelName);
System.out.println(b2.resolution);
System.out.println(b2.price);
System.out.println(b2.color);
 
//시리얼 번호 추가
int serialNumber; → 인스턴스 변수 추가
static int counter = 0; → 시리얼 번호 생성(처음엔 0이었다가 ++ 연산 통해 값을 증가)
 
BlackBox(){
System.out.println("기본 생성자 호출");
this.serialNumber = ++counter;
System.out.println("새로운 시리얼 넘버를 발급받았습니다 : " + this.serialNumber);
}
 
// b2 객체도 시리얼 넘버 발급 받을 수 있도록 해주기
BlackBox(String modelName, String resolution, int price, String color) {
this(); → 시리얼 넘버 발급(기본 생성자 호출)
System.out.println("사용자 정의 생성자 호출");
this.modelName = modelName;
this.resolution = resolution;
this.price = price;
this.color = color;
}
 

정리

→ 생성자: 객체가 만들어질 때 자동으로 호출되는 메소드
→ 기본적으로 수행되어야 하는 동작이 있다면 생성자에 넣기
→ 객체 생성과 동시에 전달값 입력할 때도 생성자 활용
→ 생성자 간 서로를 호출할 때는 this() 쓰기
 
 
 

#049 <Getter와 Setter>
*Getter & Setter

-Getter: 값을 가져오는 메소드
-Setter: 값을 설정하는 메소드
 
BlackBox b1 = new BlackBox();
b1.modelName = "까망이";
// b1.resolution = "FHD"; → 실수로 해상도 정보 입력하지 않음
b1.price = 200000;
b1.color = "블랙";
 
// 블랙박스 할인 행사 (5000원 할인)
b1.price = -5000; → 실수로 가격 자체를 -5000원으로 설정함
System.out.println("가격: " + b1.price + "원"); → 가격: -5000원
 
// 고객 문의 (해상도)
System.out.println("해상도: " + b1.resolution); → 해상도: null
 
 

// Getter & Setter

String getModelName() {
       return modelName;
}
 
void setModelName(String modelName) {
       this.modelName = modelName;
}
 
String getResolution() {
        if (resolution == null || resolution.isEmpty()) {   → 값이 없거나 비어 있을 경우
             return "판매자에게 문의하세요.";
         }
         return resolution;
         }
 
void setResolution(String resolution) {
      this.resolution = resolution;
}
 
int getPrice() {
     return price;
}
 
void setPrice(int price) {
       if (price < 100000) {   → 10만원 미만일 경우 10만원으로 표시
           this.price = 100000;
       }
       else{
           this.price = price;   → 10만원 초과하면 그 값 그대로 넣기
      }
}
 
String getColor() {
        return color;
}
 
void setColor(String color) {
        this.color = color;
}
 

출력

BlackBox b2 = new BlackBox();
b2.setModelName("하양이");
b2.setPrice(-5000);
b2.setColor("화이트");
→ resolution 은 일부러 넣지 않았음 (실수)
 
System.out.println("가격: " + b2.getPrice() + "원");
→ -5000원 대신 100000원
System.out.println("해상도: " + b2.getResolution());
→ null 대신 "판매자에게 문의하세요"
 
 

오늘의 한마디

오늘 공부한 예제의 경우 resolution과 price의 조건을 getter로 써도 setter로 써도 되는데, 다른 코드를 작성할 때는 어떤 기준으로 getter 혹은 setter를 써야 하는지 헷갈려서 한참 삽질했다... 나만 헷갈리는 게 아닌지 커뮤니티 들어가니까 다른 사람들이 올려 놓은 질문이 몇 개 있어서 읽고 읽고 또 읽었다.
 

이 답변 덕분에 그나마 조금 이해가 됐다...! (set을 할 때 조건 확인이 필요한 경우 if문을 setter에 넣기)
 

이거 이해하고 먹으려고 꺼내둔 귤은 결국 한~~~참이 지나고 나서야 먹을 수 있었다는 슬픈 사실...(엉엉엉)