럿고의 개발 노트

[프로그래머스] 자바 입문 > Part6. 클래스 다듬기 본문

카테고리 없음

[프로그래머스] 자바 입문 > Part6. 클래스 다듬기

KimSeYun 2020. 1. 25. 20:51

[프로그래머스] 자바 입문

Part6. 클래스 다듬기

1. 생성자

생성자

  • 모든 클래스는 인스턴스화 될때 생성자를 사용함

  • 생성자의 특징

    1. 리턴타입이 없음
    2. 생성자를 만들지 않으면 매개변수가 없는 생성자가 컴파일 시 자동 생성
    3. 매개변수가 없는 생성자를 기본생성자라고 함
    4. 생성자를 만들었다면, 기본생성자는 자동으로 만들어 지지 않으며, 기본생성자를 사용하기 위해서는 수동으로 지정해줘야 함.
  • 생성자의 역할은 객체가 될 때 필드를 초기화 함

public class Car {
    String name; // 필드
    int number; // 필드

    // 여기까지 생성자가 없다면 기본생성자가 만들어짐, 그러나 아래처럼 생성자를 만들면 기본생성자가 생성되지 않음 

    // 생성자가 하는 일은 객체가 될때 필드를 초기화 하는 역할

    public Car(String n) { // 생성자를 이렇게 만들면, 이름을 생성자를 만들때 이름을 지정해줘야 함.
        name = n;
    }
}
public class CarExam {
    public static void main(String[] args) {
        //Car c1 = new Car(); // Car()은 여기서 생성자가 됨
        // 생성자란, 인스턴스를 만들려면 new라는 연산자가 필요
        // new라는 연산자 이후에 생성자가 필요

        /* 생성자 선언
         * public class 클래스명 {
         *         타입 필드명;
         *         public 클래스명(매개변수 목록) { // 생성자로 메소드와 달리 리턴타입을 가지고 있지 않음
         *         
         *         } 
         */
        // 생성자 특징
        // 1. 리턴타입이 없음
        // 2. 생성자를 프로그래머가 만들지 않으면 매개변수가 없는 생성자가 컴파일 시 자동 생성
        // 3. 매개변수가 없는 생성자를 기본 생성자
        // 4. 생성자를 하나라도 프로그래머가 만들었다면 기본생성자는 생성되지 않음

        // Car클래스에서 생성자를 만들어 줬기 때문에 기본 생성자로는 생성자를 생성할 수 없음
        Car c1 = new Car("소방차");
        Car c2 = new Car("구급차");

        System.out.println(c1.name); // 이름이 소방차로 초기화
        System.out.println(c2.name); // 이름이 구급차로 초기화

    }
}

2. this

this

  • 현재 객체 즉, 자기 자신을 타나냄

  • 클래스 안에 자기 자신이 가지고 있는 필드를 사용할 때 this.필드명으로 호출 가능

  • 자기 자신이 가지고 있는 메소드를 사용할 때도 this.메소드명()으로 호출 가능

  • this를 사용하는 이유는 매개변수명과 필드명이 중복이 가능하다 보니, 둘 중에 어느 것이 필드인지, 매개변수 인지를 구분하기 위해서 임.

  • 또한 메소드 내에서 변수명을 사용하면, 가장 늦게 선언된 매개변수에 값이 저장될 것이므로 서로 구분해서 this는 키워드를 사용하는 것이 좋음
    (습관화 필요!)

public class Car2 {

    String name;
    int number;

    public Car2(String name) { // 생성자 지정
        // 이때 n이 number의 약자인지, name의 약자인지 알수가 없음
        // 변수를 사용할때는 한눈에 알아볼수 있도록 사용하는 것이 좋음
        // 따라서 name을 받기 위해서는 name으로 받는 것이 좋음
        // 그러나 이렇게 하면 위에서 필드와 매개변수가 이름이 똑같기 때문에 가장 가까운 name으로 지정한 곳을 찾게 됨
        // 따라서 아래의 name은 둘 다 매개변수 name으로 인식
        // 그래서 각자의 이름을 구분시켜줘야함.
        // 그때 사용하는게 this 키워드로, 내 구성요소, 내 것이라고 생각하면 되고, this가 있다면 내 필드에 값을 넣어달라고 하는 것
        this.name = name;
        // 그리고 자기 자신이 가지고 있는 메소드를 사용하고 싶을떄에도 this라는 키워드를 사용
        // this.메소드명으로 메소드를 호출할수 있음
        // 나의 생성자를 호출할때도 this키워드를 사용할수 있음
        // this는 객체 자신을 참조하는 키워드라고 생각하면 됨
    }
}
public class CarExam2 {

    public static void main(String[] args) {
        Car2 c1 = new Car2("소방차");
        Car2 c2 = new Car2("구급차");
    }
}

3. 메소드 오버로딩

메소드 오버로딩

  • 매개변수의 유형, 개수를 다르게 하여 같은 이름의 메소드를 여러 개 가질 수 있게 함

  • 메소드의 인자에 어떤 값을 쓰이느냐에 따라서 각기 다른 메소드가 호출됨.

public class MyClass {
    // 매개변수의 갯수나 타입이 조금씩 다르지만 비슷한 기능을 하는 메소드가 여러개 있을수도 있음
    // 이런 메소드들이 다른 이름으로 정의되어 있으면 해깔리는데 이런 문제를 해결하는 방법은 메소드 오버로딩을 사용하면 됨
    // 메소드 오버로딩이란 매개변수의 유형과 개수가 다르게 하여 같은 이름의 메소드를 여러 개 가질 수 있게 하는 기술

    public int plus (int x, int y) { // 정수형 x, y를 매개변수로 받아서 정수형 x + y으로 리턴
        return x + y;
    }

    public int plus (int x, int y, int z) { // 정수형 x, y, z를 매개변수로 받아서 정수형 x + y + z으로 리턴
        return x + y + z;
    }

    public String plus(String x, String y) { // String x, y를 매개변수로 받아 String x+y로 리턴
        return x + y;
    }

    // 위의 3개의 메소드를 같은 이름으로 매개변수와 리턴타입을 다르게 설정했지만 오류가 발생하지 않음
    // 매개변수 유형과 개수를 다르게 하거나 리턴타입을 다르게 해서 같은 메소드 이름으로 지정하는 것을 오버로딩이라고 함

//    public int plus(int i, int j) { }
//  위처럼 이미 매개변수 2개를 받는 경우를 지정했을때 변수명이 다르다고 해서 다른것은 아님. 한번 메소드를 지정한 후 또 지정하면 오류 발생
}
public class MethodOverLoadExam {
    public static void main(String[] args) {
        MyClass m = new MyClass(); 

        System.out.println(m.plus(4, 5)); // 메소드 실행 : 9
        System.out.println(m.plus(4, 5, 6)); // 메소드 실행 : 15
        System.out.println(m.plus("Hello", "World")); // 메소드 실행 : HelloWrold
    }
}

4. 생성자 오버로딩과 this

생성자 오버로딩

  • 생성자의 매개변수의 유형과 개수를 다르게 하여 같은 이름의 생성자를 여러 개 가질 수 있음

  • 자기 생성자를 호출하는 this()키워드도 있음

  • 자기 자신의 생성자를 호출함으로써 중복 코드를 방지

public class Car3 {
    String name;
    int number;

    public Car3(String name) {
        this.name = name;
    }

    // 생성자 오버로딩이란, 매소드와 마찬가지로 매개변수의 수와 타입이 다르다면 여러개의 생성자를 가질 수 있음
    // 생성자를 정의를 하면 기본생성자가 만들어지지 않는다고 했는데, 기본생성자를 직접 정의해 준다면 가능함(오버로딩)
    public Car3() {
        // this.name = "이름없음"; // 기본생성자 name값 초기화
        // this.number = 0; // 기본생성자 number값 초기화
        // 그러나 아래의 메소드와 이 메소드와 this.name과 this.number가 중복임
        // 그걸 해결 하기 위한 방법이 존재
        this("이름없음", 0); // 이렇게 사용하면 나의 생성자를 의미
        // 위에 처럼 적는다면 아래에 있는 생성자가 호출됨
    }

    public Car3(String name, int number) {
        this.name = name;
        this.number = number;
    }    
}
public class CarExam3 {
    public static void main(String[] args) {
        Car3 c1 = new Car3("소방차");
        Car3 c2 = new Car3(); // 기본생성자로 생성
        Car3 c3 = new Car3("구급차", 1111); 
    }
}

5. 패키지

패키지(Package)

  • 서로 관련이 있는 클래스, 인터페이스들의 묶음

  • 클래스들이 필요할때만 사용 될 수 있도록 하며, 클래스를 패키지 이름과 함께 계층적 형태로 사용함으로써 다른 그룹에 속한 클래스와 발생할 수 있는 클래스 이름간의 충돌을 막아줌으로써 클래스 관리를 편리하게 함

  • 클래스 정의 방법

    • package이름은 보통 도메인 이름을 거꾸로 적은 후, 그 뒤에 프로젝트 이름을 붙여 만들며 물론 프로젝트 이름 뒤에 또 다른 이름이 나올 수 있음
    • 폴더명.폴더명.폴더명과 같은 형식으로 만들어 지며, 폴더명은 숫자로 시작할 수 없음
    • 도메인으로 사용하는 이유는 중복 방지로써 반드시 존재하는 도메인이 아니라도 상관 없음
  • 패키지 생성 방법

    1. 소스폴더 선택 후 우측버튼을 클릭하여 패키지 생성 버튼 선택
    2. 패키지 이름 작성
    3. 클래스 생성
    4. 클래스 내에 맨 윗줄에 package 패키지명;이 생성됨
  • 패키지에 생성된 클래스 사용

    • java.lang패키지를 제외하고 다른 패키지에 있는 클래스를 사용하려면 import 구문이 필요함
    • 클래스 이름 대신 *(패키지 내 모든 클래스 선택)을 사용해도 됨.
  • import하지 않고 사용하는 방법

    • import를 사용하지 않고 클래스를 사용하려면 '패키지명.클래스명' 형태로 적어줘야함.

※ 출처

[프로그래머스] 자바 입문

Comments