사이먼's 코딩노트
[Java] 캐스팅 / 생성자 본문
[캐스팅]
- 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 함수에서 커스텀해서 사용하는 것도 당연히 가능하다.
반응형
'Java > Java' 카테고리의 다른 글
[Java] 추상 클래스 / 인터페이스 (0) | 2024.02.14 |
---|---|
[Java] 생성자 문제풀이 (1) | 2024.02.14 |
[Java] 클래스와 메서드를 활용한 문제풀이 (0) | 2024.02.06 |
[Java] 상속 / 오버로딩 / 오버라이딩 (0) | 2024.02.02 |
[Java] 클래스와 메서드(2) (0) | 2024.02.02 |