본문 바로가기
Everyday Study

2024.07.12 (금) { try-catch, toString(), 다형성(Polymorphism) }

by xogns93 2024. 7. 12.

' 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() 메서드를 재정의하여 객체의 필드 값을 포함하는 의미 있는 문자열을 반환하도록 합니다.

사용 예

  1. 디버깅: toString() 메서드를 재정의하면 디버깅 시 객체의 상태를 쉽게 확인할 수 있습니다.
  2. 로깅: 로그 메시지에 객체의 상태를 포함할 때 유용합니다.
  3. 출력: 객체를 출력할 때 자동으로 toString() 메서드가 호출되므로, 객체의 상태를 사용자에게 쉽게 전달할 수 있습니다.

다형성(Polymorphism)

 

자바의 다형성(Polymorphism)은 객체 지향 프로그래밍의 중요한 특성 중 하나로, 동일한 인터페이스 또는 부모 클래스를 통해 여러 다른 타입의 객체를 다룰 수 있게 해줍니다. 다형성은 주로 메소드 오버라이딩(Method Overriding)과 메소드 오버로딩(Method Overloading)을 통해 구현됩니다.

 

다형성의 종류

  1. 컴파일 타임 다형성 (Compile-Time Polymorphism):
    • 메소드 오버로딩(Method Overloading)
    • 컴파일 시에 호출될 메소드가 결정됨.
  2. 런타임 다형성 (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 메소드가 호출됩니다.

 


다형성의 장점

  1. 유연성: 동일한 인터페이스를 통해 다양한 객체를 다룰 수 있어 코드의 유연성이 높아집니다.
  2. 재사용성: 기존 코드를 재사용할 수 있어 개발 효율성이 높아집니다.
  3. 유지보수성: 코드 수정 시 중복된 코드를 최소화하여 유지보수가 용이합니다.

결론

다형성은 객체 지향 프로그래밍의 핵심 개념으로, 동일한 인터페이스 또는 부모 클래스를 통해 다양한 객체를 다룰 수 있게 해줍니다. 이를 통해 코드의 유연성, 재사용성, 유지보수성을 높일 수 있으며, 다양한 디자인 패턴과 구조에서 중요한 역할을 합니다. 메소드 오버로딩과 오버라이딩을 잘 이해하고 활용하면 더욱 효과적인 자바 프로그램을 작성할 수 있습니다.