사이먼's 코딩노트

[Java] 캐스팅 / 생성자 본문

Java/Java

[Java] 캐스팅 / 생성자

simonpark817 2024. 2. 14. 10:57

[캐스팅]

  • Java에서는 형변환을 캐스팅이라고 한다.
  • 여기서 말하는 형변환이란 말그래도 형태를 변환한다는 뜻이다.
  • 예를 들어 정수형 타입인 int와 실수형 타입인 double이 있다면 서로의 타입으로 형태를 변환하는 것이 캐스팅이라고 한다.
int i = 10;
double d = i; 
i = (int)d; 
System.out.println(i);
  • 위 코드를 보면 변수 i는 정수 타입으로 선언되었고 10이라는 값을 넣었다.
  • 변수 d는 실수 타입으로 선언되었고 i가 가지고 있는 10이라는 값을 넣었다.
  • 여기서 먼저 d를 출력문을 통해 출력해보면 10이 아닌 실수 타입에 맞춰 10.0이 출력될 것이다. 이 때 i가 가지고 있는 정수 10은 자동으로 형변환 즉, 캐스팅이 된 것이다.
  • 이번에는 반대로 정수인 10을 실수 형태인 변수 d에 넣기 위해서는 그냥 i = d라고 하면 무조건 에러가 난다.
  • 이 때는 사용자가 직접 실수 형태인 변수 d 앞에 정수를 넣을 것을 예고하는 (int)를 작성한다. 이 때는 자동 형변환이 아닌 수동으로 형변환 즉, 강제 캐스팅이 됐다고 표현한다.

 

[생성자]

  • 다음은 아래 코드를 하나씩 해석하면서 클래스와 메서드의 관계를 살펴보자.
public class Main {
    public static void main(String[] args) {
        
        전사 a칼전사 = new 전사();
        a칼전사.이름 = "철수";
        a칼전사.a무기 = new 칼();
        a칼전사.공격();
    }
}
class 전사 {
    무기 a무기;
    String 이름;
    void 공격() {
        a무기.작동(이름);
    }
}
class 무기 {
    void 작동(String 공격자명) {

    }
}
class 칼 extends 무기 {
    void 작동(String 공격자명) {
        System.out.printf("%s이(가) 칼로 공격합니다.\n", 공격자명);
    }
}
  • a칼전사라는 객체 변수를 만들기 위해서는 전사 설계도가 있어야 하기 때문에 class 전사를 생성해준다.
  • a칼전사는 이름과 무기를 가지고 있고 공격이라는 능력을 가지고 있다.
  • 전사 클래스를 통해서 이름과 a무기 변수를 선언해주고, 공격이라는 메서드를 생성해준다.
  • 이름의 타입은 String, a무기의 타입은 무기이다. 이 때 무기라는 타입은 정해진 것이 아니기 때문에 무기 클래스를 또 하나 생성해줘야 한다.
  • Main 메서드에서 a칼전사가 지닌 a무기는 칼이라는 객체로 연결되었기 때문에 a무기는 칼 타입이라는 것을 눈치채고 무기 클래스를 상속받는 칼 클래스를 또 하나 생성해줘야 한다.
  • 전사 클래스에 있는 공격 메서드에서 바로 출력문을 출력해도 되지만, 칼이라는 타입의 무기 말고도 여러가지 종류의 무기가 있을 수 있기 때문에 무기를 공격하는 공격자의 이름을 인자로 받는 작동() 이라는 메서드를 실행시켜주고, 무기 클래스에서 작동() 메서드를 생성하여 실행해준다.
  • 이 때 오버라이딩을 통해 칼 클래스에도 똑같은 작동() 메서드를 생성하여 출력문을 작성해주면 Main 메서드를 실행하였을 때 "철수(이)가 칼로 공격합니다" 라는 문장을 출력하게 된다.

 

  • 우리는 여기서 Main 메서드를 통해 일일이 이름과 무기 타입을 설정하고있다.
  • 이런 귀찮은 작업을 피하고 기본 세팅값을 적용하는 생성자를 사용하는 것이 편리하다.
  • 아래 코드는 똑같은 기능을 하지만 생성자가 포함된 코드이다.
public class Main {
    public static void main(String[] args) {

        전사 a칼전사 = new 전사();
        a칼전사.공격();
    }
}
class 전사 {
    무기 a무기;
    String 이름;
    전사() {
        this.이름 = "철수";
        this.a무기 = new 칼();
    }
    void 공격() {
        a무기.작동(이름);
    }
}
class 무기 {
    void 작동(String 공격자명) {

    }
}
class 칼 extends 무기 {
    void 작동(String 공격자명) {
        System.out.printf("%s이(가) 칼로 공격합니다.\n", 공격자명);
    }
}
  • 여기서 생성자 역할을 하는 것은 전사 클래스 안에 있는 전사() 이다.
  • 수동으로 반드시 한 번씩 호출해야하는 메서드가 있다면 생성자 메서드를 사용하는 것이 좋다.
  • 생성자는 void 타입 없이 클래스 네임과 동일하게 메서드를 작성하면 Main 메서드에서 호출없이도 자동으로 기본 세팅이 가능한 역할을 한다.
  • 생성자는 return 타입도 아니고, 클래스와 이름이 반드시 동일해야한다.
  • 생성자는 보통 메서드 중 가장 위쪽에 작성해주는 것이 관례이다.
  • Main 메서드에서 new 전사() 라는 객체가 새로 생성됨과 동시에 자동으로 생성자에 작성한 이름(철수)과 무기(칼) 타입이 최초 세팅된다.
  • 생성자를 사용하면 Main 메서드에서는 이름과 무기를 따로 커스텀하지 않아도 new 전사() 와 같이 객체를 생성함과 동시에 전사() 생성자가 실행된다.
  • 만약 사용자가 최초 세팅된 변수의 값을 바꾸고 싶다면 Main 함수에서 커스텀해서 사용하는 것도 당연히 가능하다.
반응형