간단

자바)객체지향으로 BlackBox 만들기(4) 본문

Java

자바)객체지향으로 BlackBox 만들기(4)

I want to Sleep 2023. 4. 29. 22:07
728x90

(7)this

1. 까돌이라는 이름으로 둔 제품이 판매가 되지 않아서 까돌이(최신형) 로 이름을 바꿀 것 이다.

public class _07_This {
    public static void main(String[] args) {
        BlackBox b1 =new BlackBox();
        //인스턴스 변수에 modelName
        //물건이 잘 안팔린다고 가정

        b1.modelName ="까돌이"; // 까돌이(최신형)로 잘 팔리게끔 유도 (업데이트)
        b1.appendModelName("(최신형)");
        System.out.println(b1.modelName);
        //최신형으로 바꿀려면 class 파일에 아래와 같이 코드를 작성해야 할 것이다.
//        void appendModelName(String modelName){} (인텔리제이는 appendModelName 마우스 두고  alt+enter로 바로 생성가능)

    }
}

#잘못된 방법#

 블랙박스class에 아래 코드와 같이 적고 위 파일 코드들을 실행 시키면 업데이트가  되지 않고

 그대로 "까돌이"가 호출된다.  

void appendModelName(String modelName){
    modelName += modelName;

해석해보면 왼쪽에 있는 modelName과 오른쪽에 있는 modelName은 appendModelName의 매개변수이다.

즉, 지금 매개변수는 _07_This class에 있는 b1.appendModelName("(최신형)") 의 전달값인것 

(최신형) += (최신형) 이며 메소드 안에서 아무런 출력값도 주지 않았으니 호출하면 의미없이 사라져버린다.

방법1.

기본적으로  까돌이(최신형)을 붙이는 방법은 appendModelName 의매개변수 이름을 바꿔서 작성해주는것이다.

appendModelName의 전달값은 (최신형) 아래 식을 풀어써보면 까돌이 = 까돌이 + (최신형) 

출력(modelName=까돌이(최신형) 이 되는 것 

public void appendModelName(String modelNames) {
    modelName += modelNames;
    System.out.println(modelName);
}
b1.modelName ="까순이"; 
b1.appendModelName("(최신형)");

방법2.(지향하는 방법)

public void appendModelName(String modelNames) {
     this.modelName +=modelNames;
}
b1.modelName ="까순이"; 
b1.appendModelName("(최신형)");
System.out.println(b1.modelName);

this.modelName = BlackBox 라는 class에 의해 만들어진 객체 b1

b1객체의  modelName인 맴버변수와 appendModelName의 매개변수 이름이 같을 때 this를 사용하여 접근 할 수 있다

장점

  - 코드의 가독성이 좋아진다.

  - 맴버변수와 메소드 매개변수의 이름이 같을때 객체의 맴버변수에 접근 할 수 있게 해준다.

  -코드유지 보수 등 이점이 많다.

(8)생성자

      - 생성자는 객체가 생성될 때 객체를 초기화를 위해 실행되는 메서드

      - 객체가 생성될 때 자동으로 호출되는 메서드

      - 클래스 이름과 동일하며 반환값이 없다

 

     보통은 가독성을 위해 class안의 인스턴스 변수 아래다가 작성.

     

      클래스명(){

      //초기화 시키는 코드들...

       }

 

BlackBox class에 시리얼번호 추가 기능

static  int counter = 0; //시리얼 번호를 생성해주는 역할 (처음엔 0이었다가 증가 ++ 1,2, ,,,

제품에 시리얼번호 추가

int serialNumber; // 시리얼번호

#기본생성자에 this를 붙이지 않아도 출력값은 그대로 출력된다.

이유는 컴파일러가 this를 자동으로 추가를 해주기 때문이며 코드의 가독성을 높여주기 위해 사용한다.

//기본 생성자
BlackBox(){
    System.out.println("기본 생성자 호출");
    this.serialNumber = ++counter;
    System.out.println("새로운 시리얼 넘버를 발급 받았습니다." + this.serialNumber);
}
//생성자 오버로딩
//지정 생성자
BlackBox(String modelName , String resolution , int price , String color){
    this(); // 기본 생성자 호출 this() : 클래스안의 다른 생성자 호출 가능

    System.out.println("사용자 정의 생성자 호출");
    this.modelName = modelName;
    this.resolution=resolution;
    this.price = price;
    this.color =color;
}

 

 ● 지정생성자의 this() : this. 같은 경우에는 인스턴스변수에 접근 할 수 있었지만 this()는 다른 생성자를 호출 할 수 있어서 BlackBox() 기본생성자 내용을 호출하게 된다.

 

main에 돌아와서 아래와 같은 코드로 호출 

public class _08_Constructor {
    public static void main(String[] args) {
        //생성자는 객체가 만들어질때 호출되는 메서드
        BlackBox b1 = new BlackBox();
        //원래는 일일이 하나씩 선언해주고 초기화를 하였다.

        b1.modelName = "까망이";
        b1.resolution = "FHD";
        b1.price = 200000;
        b1.color = "블랙";
        System.out.println(b1.modelName);
        System.out.println(b1.resolution);
        System.out.println(b1.price);
        System.out.println(b1.color);


        System.out.println(" ---------------------");
        BlackBox b2 = new BlackBox("하양이", "UHD", 300000, "화이트");
        System.out.println(b2.modelName);
        System.out.println(b2.resolution);
        System.out.println(b2.color);
        System.out.println(b2.price);


    }
}

기본 생성자 호출
새로운 시리얼 넘버를 발급 받았습니다.1
까망이
FHD
200000
블랙
 ---------------------
기본 생성자 호출
새로운 시리얼 넘버를 발급 받았습니다.2
사용자 정의 생성자 호출
하양이
UHD
화이트
300000

생성자의 정리


 객체 생성시, 필요한 초기 작업을 시키기 위한 목적이 크다. 필드(변수) 초기화,필요한 메모리 확보, 파일 열기, 네트워크 연결 등 객체 활동 전 필요한 초기 준비작업에 이용한다.