사이먼's 코딩노트
[Java] super / final / switch 본문
[super]
- 이번에는 super() 메서드에 대해서 같이 알아봅시다.
- 먼저 아래의 예시 코드를 통해 super() 메서드의 역할과 의미를 파악해봅시다.
public class Main {
public static void main(String[] args) {
System.out.println("== 청둥오리객체 생성시작 ==");
new 청둥오리();
System.out.println("== 청둥오리객체 생성끝 ==");
/* 출력
== 청둥오리객체 생성시작 ==
생물이 생성되었습니다.
동물이 생성되었습니다.
오리가 생성되었습니다.
청둥오리가 생성되었습니다.
== 청둥오리객체 생성끝 ==
*/
}
}
class 생물 {
생물() {
System.out.println("생물이 생성되었습니다.");
}
}
class 동물 extends 생물 {
동물() {
super();
System.out.println("동물이 생성되었습니다.");
}
}
class 오리 extends 동물 {
오리() {
super();
System.out.println("오리가 생성되었습니다.");
}
}
class 청둥오리 extends 오리 {
청둥오리() {
super();
System.out.println("청둥오리가 생성되었습니다.");
}
}
- Main 메서드는 new 청둥오리() 를 통해 청둥오리 객체를 하나 생성함과 동시에 출력문으로 생물, 동물, 오리, 청둥오리가 모두 생성되었다 라고 출력하길 원하고 있다.
- 기본적으로 클래스는 super() 라는 메서드가 생략되어 적용되고 있다.
- super() 메서드의 역할은 상속받은 부모의 생성자를 먼저 호출하도록 한다.
- super() 메서드는 각 생성자 메서드에서 반드시 가장 윗 줄에 위치해야한다.
- 위 코드에서는 생물, 동물, 오리의 객체 생성을 따로 하지 않고 상속의 개념을 이용하여 단계적으로 부모 클래스의 생성자를 호출함으로써 원하는 4줄의 출력문이 출력되게 된다.
- 쉽게 말해 청둥오리는 오리이자, 동물이자, 생물이기 때문에 각 하위 자식 클래스에서 super()를 호출하여 상위 클래스의 생성자가 작동하도록 한다.
- super()와 관련된 문제를 간단하게 하나만 풀어봅시다.
- 주어진 코드에서 사람 클래스만 수정하여 출력문이 정상적으로 출력되도록 코드를 완성해봅시다.
public class Main {
public static void main(String[] args) {
new 사람();
}
}
class 동물 {
동물(String 이름) {
System.out.println("동물(String 이름) 실행됨!");
System.out.println("이름 : " + 이름);
}
동물(String 이름, int 나이) {
System.out.println("동물(String 이름, int 나이) 실행됨!");
System.out.println("이름 : " + 이름);
System.out.println("나이 : " + 나이);
}
}
class 사람 extends 동물 {
}
- 수정된 사람 클래스만 작성하여 보여드립니다. (나머지는 수정된 부분이 없습니다.)
class 사람 extends 동물 {
사람() {
// super("홍길동");
super("홍길동", 20);
}
}
- Main 메서드에서는 생성자 메서드의 오버로딩으로 총 2개의 생성자가 작성되어 있다.
- 이렇게 부모 클래스의 생성자가 어떤 변수들을 매개변수로 받고 있다면 자식 클래스에서 super() 메서드를 이용하여 매개변수에 맞춰 인자를 넘겨줘야한다.
- 이 때 자식 클래스에서는 super() 메서드를 이용하여 반드시 하나의 부모 클래스 생성자만을 호출해야한다. 중복 호출이 불가능하다.
[final]
- 이번에는 final에 대해서 같이 알아봅시다.
- 먼저 아래의 예시 코드를 통해 final 역할과 의미를 파악해봅시다.
public class Main {
public static void main(String[] args) {
final int a;
a = 10;
// a = 20;
System.out.println(a);
}
}
- 일반적으로 변수의 타입을 int로 지정했다면 해당 변수는 계속해서 정수 값을 변경할 수 있다.
- 하지만 final이 타입 앞에 붙게 된다면 해당 변수는 상수가 된다. 즉, 변경이 불가능한 변수가 된다.
- 위 코드에서 변수 a는 final int 타입으로 선언되었다.
- 주석 처리된 a = 20이라는 코드의 주석을 해제하고 프로그램을 실행시키면 에러가 발생하게 된다.
- 그 이유는 a는 이미 final로 인해 상수가 되어 값을 변경할 수 없기 때문이다.
[switch]
- 이번에는 switch문에 대해서 같이 알아봅시다.
- 먼저 아래의 예시 코드를 통해 switch문의 역할과 의미를 파악해봅시다.
public class Main {
public static void main(String[] args) {
계절변환기 a = new 계절변환기();
for ( int month = 1; month <= 12; month++ ) {
String 계절 = a.get계절(month);
System.out.println(month + "월은 " + 계절 + "입니다.");
}
}
}
class 계절변환기 {
String get계절(int month) {
String 계절 = "";
switch( month ) {
case 3:
case 4:
case 5:
return 계절 = "봄";
// return을 하지 않으려면 break; 사용
case 6:
case 7:
case 8:
return 계절 = "여름";
// break;
case 9:
case 10:
case 11:
return 계절 = "가을";
// break;
default:
return 계절 = "겨울";
// break;
}
}
}
- Main 메서드를 보면 계절변환기를 이용하여 1부터 12까지 반복문을 돌고 get계절() 메서드를 통해 해당 월이 봄, 여름, 가을, 겨울인지를 알아내고 그에 맞는 출력문을 출력하도록 되어있다.
- 먼저 get계절() 메서드는 매개변수로 정수값을 받고 있고 해당 메서드는 계절변환기 클래스에서 선언해야한다.
- get계절() 메서드는 String 타입으로 선언된 계절 변수에 저장되기 때문에 메서드의 타입을 String으로 해주고 return 값으로도 String을 반환해야한다.
- 그 다음, switch문을 이용하여 각 월별로 계절을 구한다.
- switch()에서 () 에는 인자 값을 넣어주고 case 3: 과 같이 각 케이스들을 구성하여 맞는 조건에 return 값을 적어준다.
- 사실 swtich문은 조건문 if와 같은 역할을 한다. 다만, if문에서는 요구하는 조건들이 많아질 때 switch문을 사용하면 모다 더 간단한 로직을 구현할 수도 있다.
- if문에서는 마지막 모든 예외사항 처리를 else로 하듯이 switch문에서는 default: 로 모든 예외사항 처리를 한다.
반응형
'Java > Java' 카테고리의 다른 글
[Java] 문자열을 다루는 String 클래스 메서드 (2) | 2024.03.13 |
---|---|
[Java] static (0) | 2024.03.12 |
[Java] 생성자 문제풀이 (0) | 2024.03.12 |
[Java] 문제풀이(2) (0) | 2024.03.11 |
[Java] 문제풀이(1) (0) | 2024.03.11 |