' try-catch '
try-catch 문은 자바에서 예외 처리를 위한 구조입니다. 예외가 발생할 수 있는 코드를 try 블록 내에 작성하고, 예외가 발생했을 때 이를 처리하는 코드를 catch 블록 내에 작성합니다. 이를 통해 프로그램의 비정상 종료를 방지하고, 예외 발생 시 적절한 대처를 할 수 있습니다.
기본 구조
try {
// 예외가 발생할 수 있는 코드
} catch (ExceptionType e) {
// 예외 처리 코드
}
' toString() '
toString() 메서드는 자바에서 객체를 문자열로 표현하는 방법을 제공하는 메서드입니다. 모든 클래스는 Object클래스를 상속받으며, Object 클래스의 toString() 메서드를 재정의(override)하여 객체의 상태를 의미 있는 문자열로 변환할 수 있습니다.
기본 toString() 메서드
기본적으로 Object 클래스의 toString() 메서드는 다음과 같은 형식의 문자열을 반환합니다
getClass().getName() + "@" + Integer.toHexString(hashCode())
이 문자열은 객체의 클래스 이름과 객체의 해시코드를 16진수로 나타낸 것입니다.
toString() 메서드 재정의
일반적으로 객체의 상태를 더 잘 나타내기 위해 toString() 메서드를 재정의합니다. 예를 들어, 객체의 필드 값을 포함하는 문자열을 반환하도록 할 수 있습니다.
class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person{name='" + name + "', age=" + age + "}";
}
public static void main(String[] args) {
Person person = new Person("John", 25);
System.out.println(person); // Person{name='John', age=25}
}
}
예제
다음은 Person 클래스에서 toString() 메서드를 재정의하는 예제입니다.
class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person{name='" + name + "', age=" + age + "}";
}
public static void main(String[] args) {
Person person = new Person("John", 25);
System.out.println(person); // Person{name='John', age=25}
}
}
설명
- 기본 toString() 메서드: Object 클래스의 toString() 메서드는 객체의 클래스 이름과 해시코드를 반환합니다.
- 재정의된 toString() 메서드: Person 클래스에서 toString() 메서드를 재정의하여 객체의 필드 값을 포함하는 의미 있는 문자열을 반환하도록 합니다.
사용 예
- 디버깅: toString() 메서드를 재정의하면 디버깅 시 객체의 상태를 쉽게 확인할 수 있습니다.
- 로깅: 로그 메시지에 객체의 상태를 포함할 때 유용합니다.
- 출력: 객체를 출력할 때 자동으로 toString() 메서드가 호출되므로, 객체의 상태를 사용자에게 쉽게 전달할 수 있습니다.
다형성(Polymorphism)
자바의 다형성(Polymorphism)은 객체 지향 프로그래밍의 중요한 특성 중 하나로, 동일한 인터페이스 또는 부모 클래스를 통해 여러 다른 타입의 객체를 다룰 수 있게 해줍니다. 다형성은 주로 메소드 오버라이딩(Method Overriding)과 메소드 오버로딩(Method Overloading)을 통해 구현됩니다.
다형성의 종류
- 컴파일 타임 다형성 (Compile-Time Polymorphism):
- 메소드 오버로딩(Method Overloading)
- 컴파일 시에 호출될 메소드가 결정됨.
- 런타임 다형성 (Runtime Polymorphism):
- 메소드 오버라이딩(Method Overriding)
- 실행 시에 호출될 메소드가 결정됨.
메소드 오버로딩 (Method Overloading)
메소드 오버로딩은 같은 이름의 메소드를 여러 개 정의하는 것입니다. 이때 메소드의 파라미터 타입이나 개수가 달라야 합니다. 컴파일 타임 다형성의 한 예입니다.
public class OverloadingExample {
public void print(int number) {
System.out.println("Number: " + number);
}
public void print(String text) {
System.out.println("Text: " + text);
}
public void print(int number, String text) {
System.out.println("Number: " + number + ", Text: " + text);
}
public static void main(String[] args) {
OverloadingExample example = new OverloadingExample();
example.print(10); // Number: 10
example.print("Hello"); // Text: Hello
example.print(20, "World"); // Number: 20, Text: World
}
}
위 예제에서 print 메소드는 세 가지 형태로 오버로딩되어 있습니다. 각 메소드는 다른 파라미터 리스트를 가지고 있으며, 호출될 메소드는 컴파일 시에 결정됩니다.
메소드 오버라이딩 (Method Overriding)
메소드 오버라이딩은 자식 클래스가 부모 클래스의 메소드를 재정의하는 것입니다. 런타임 다형성의 한 예입니다. 오버라이딩된 메소드는 부모 클래스의 참조를 통해 호출되더라도 실제 객체의 타입에 따라 자식 클래스의 메소드가 실행됩니다.
class Animal {
public void sound() {
System.out.println("Animal makes a sound");
}
}
class Dog extends Animal {
@Override
public void sound() {
System.out.println("Dog barks");
}
}
class Cat extends Animal {
@Override
public void sound() {
System.out.println("Cat meows");
}
}
public class OverridingExample {
public static void main(String[] args) {
Animal myAnimal = new Animal();
Animal myDog = new Dog();
Animal myCat = new Cat();
myAnimal.sound(); // Animal makes a sound
myDog.sound(); // Dog barks
myCat.sound(); // Cat meows
}
}
위 예제에서 Dog와 Cat 클래스는 Animal 클래스를 상속받아 sound 메소드를 오버라이딩합니다. Animal 타입의 변수로 각기 다른 객체(Animal, Dog, Cat)를 참조할 수 있으며, 실제 객체의 타입에 따라 적절한 sound 메소드가 호출됩니다.
다형성의 장점
- 유연성: 동일한 인터페이스를 통해 다양한 객체를 다룰 수 있어 코드의 유연성이 높아집니다.
- 재사용성: 기존 코드를 재사용할 수 있어 개발 효율성이 높아집니다.
- 유지보수성: 코드 수정 시 중복된 코드를 최소화하여 유지보수가 용이합니다.
결론
다형성은 객체 지향 프로그래밍의 핵심 개념으로, 동일한 인터페이스 또는 부모 클래스를 통해 다양한 객체를 다룰 수 있게 해줍니다. 이를 통해 코드의 유연성, 재사용성, 유지보수성을 높일 수 있으며, 다양한 디자인 패턴과 구조에서 중요한 역할을 합니다. 메소드 오버로딩과 오버라이딩을 잘 이해하고 활용하면 더욱 효과적인 자바 프로그램을 작성할 수 있습니다.
'Everyday Study' 카테고리의 다른 글
2024.07.16 (화) { valueOf, 직렬화(Serialize), is-a, 마커인터페이스 } (0) | 2024.07.16 |
---|---|
2024.07.15 (월) { 제너릭 } (0) | 2024.07.15 |
2024.07.11 (목) {소수 찾는 코드, 리팩토링, enum} (0) | 2024.07.11 |
2024.07.10 (수) {퀴즈 코드 연습} (0) | 2024.07.10 |
2024.07.09 (화) {코드연습, 마커 인터페이스} (0) | 2024.07.09 |