Part6 클래스 다듬기

생성자

모든 클래스는 인스턴스화 될 때 생성자를 사용한다.

  • 생성자의 특징
    • 생성자는 리턴타입이 없다.
    • 생성자를 프로그래머가 만들지 않으면 매개변수가 없는 생성자가 컴파일할 때 자동으로 만들어진다.
    • 매개변수가 없는 생성자를 기본생성자라고 한다.
    • 생성자를 하나라도 프로그래머가 만들었따면 기본생성자는 자동으로 만들어지지 않는다.
  • 생성자의 역할
    • 생성자가 하는 일은 객체가 될 때 필드를 초기화 하는 역할을 수행한다.
    • 자동차가 객체가 될 때 반드시 이름을 가지도록 하려면, Car 클래스를 다음과 같이 만들어야 한다.
    public class Car{
        String name;
        int number;
    
        public Car(String n){
            name = n;
        }
    }
      
    // 위의 Car 클래스를 이용하여 Car 인스턴스를 생성하는 방법
    public class CarExam2{
        public static void main(String args[]){
    
            Car c1 = new Car("소방차");
            Car c2 = new Car("구급차");
            //Car c3 = new Car(); // 컴파일 오류가 발생합니다.
    
            System.out.println(c1.name);
    
            System.out.println(c2.name);
        }
    }
    // Car클래스는 기본 생성자를 가지지 않는다. 그래서 기본생성자로 Car 객체를 생성할 수 없다.
    

this

this는 현재 객체, 자기 자신을 나타낸다.

  • this의 사용
    public class Car{
        String name;
        int number;
    
        public Car(String n){
            name = n;
        }
    }
    • Car 클래스의 생성자 매개변수의 이름이 n 이다. n 이라는 변수명은 무엇을 의미하는지 쉽게 알 수 없다.
    • n 으로 쓰기 보다는 name 으로 사용하는 것이 좋다.
    public Car(String name){
        name = name;
    }
    • “name=name”이라고 코드를 바꾸면, 가깝게 선언된 변수를 우선 사용하기 때문에 “name=name”이라는 코드는 매개변수의 name의 값을 매개변수 name에 대입하라는 의미가 된다.
    • 즉, 필드는 바뀌지 않는다. 이런 경우 필드라는 것을 컴파일러와 JVM에게 알려주기 위해서 this 키워드를 사용해야 한다.
    public Car(String name){
        this.name = name;
    }
    • 앞의 this.name은 필드 name을 말하고 =(이퀄) 뒤의 name은 매개변수를 의미한다.
    • 즉 매개변수의 값을 필드에 대입하라는 의미가 된다.
  • 클래스 안에서 자기 자신이 가지고 있는 메소드를 사용할 때도 this.메소드명()으로 호출할 수 있다.

메소드 오버로딩

  • 매개변수의 유형과 개수가 다르게 하여 같은 이름의 메소드를 여러개 가질 수 있게하는 기술
  • 메소드 오버로딩
    • 이름은 같지만 매개변수가 다른 메소드
    • 메소드 오버로딩은 매개변수 부분이 달라야 한다.
    • 매개변수의 타입과 개수가 동일한 메소드를 또 정의 할 수는 없다.
  • 오버로딩된 메소드 이용하기
    • 메소드의 인자에 어떤 값이 쓰이냐에 따라서 각기 다른 메소드가 호출된다.
    public MethodOverloadExam{
        public static void main(String args[]){
            MyClass2 m = new MyClass2();
            System.out.println(m.plus(5,10));
            System.out.println(m.plus(5,10,15));
            System.out.println(m.plus("hello" + " world"));
        }
    }

생성자 오버로딩과 this

  • 생성자의 매개변수의 유형과 개수가 다르게 하여 같은 이름의 생성자를 여러 개 가질 수 있다.
    • 생성자도 메소드와 마찬가지로 여러개를 선언할 수 있다.
    • 매개변수의 수와 타입이 다르다면 여러개의 생성자를 선언할 수 있다.
    public class Car{
        String name;
        int number;

        public Car(){

        }

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

        public Car(String name, int number){
            this.name = name;
            this.number = number;
        }
    }
  • 오버로딩된 생성자 이용하기
public class CarExam4{
    public static void main(String args[]){
        Car c1 = new Car();
        Car c2 = new Car("소방차");
        Car c3 = new Car("구급차", 1234);
    }
}
  • 자기 생성자 호출하는 this()
    • 기본생성자를 호출하였을 때 name을 “이름없음”, 숫자를 0으로 초기화 하기
    public Car(){
        this.name = "이름없음";
        this.number = 0;
    }
    

- - 위처럼 작성했을 경우 코드의 중복이 일어난다. - 자신이 가지고 있는 다른 생성자를 이용할 수 있다.

    public Car(){
        this("이름없음", 0);
    }
    

패키지

패키지(package)란 서로 관련이 있는 클래스 또는 인터페이스들을 묶어 놓은 묶음이다. 패키지를 사용함으로써 클래스들이 필요할 때만 사용될 수 있도록 하고, 클래스를 패키지 이름과 함께 계층적인 형태로 사용함으로써 다른 그룹에 속한 클래스와 발생할 수 있는 클래스 이름간의 충돌을 막아줌으로 관리를 편하게 해준다.

  • 패키지 정의방법
    • package이름은 보통 도메인 이름을 거꾸로 적은 후, 그 뒤에 프로젝트 이름을 붙여서 만든다. 물론, 프로젝트 이름 뒤에 또 다른 이름이 나올 수도 있다.
    • package이름은 폴더명 점 폴더명 점 폴더명 과 같은 형식으로 만들어진다. 각각의 폴더명은 숫자로 시작할 수 없다.
    • 도메인 이름이 8cruz.com 이고 프로젝트 이름이 javastudy 라면 com.eightcruz.javastudy.Hello 로 패키지를 지정 할 수 있다.
      • 도메인이 숫자로 시작되는데 패키지명은 첫글자에 숫자를 사용할 수 없으므로 적절하게 수정한다.
      • 도메인으로 사용하는 이유는 패키지가 중복되는것을 방지하기 위함이므로, 반드시 존재하는 도메인이 아니라도 상관없다.
  • 패키지에 생성된 클래스 사용하기
    • java.lang 패키지를 제외하고는 다른 패키지에 있는 클래스를 사용하려면 import라는 구문을 적어줘야 한다.
      • import com.eightcruz.javastudy.Hello;
      • import com.eightcruz.javastudy.*;
        • 해당 패키지에 있는 모든 클래스를 사용한다는 의미

댓글남기기