Java에서 this와 super 키워드 차이점

안녕하세요, 여러분! 오늘은 Java의 핵심 키워드, 바로 thissuper에 대해 함께 알아보는 시간을 가져보려고 해요. 마치 마법 주문처럼 느껴지는 이 두 키워드, 막상 사용하려면 헷갈릴 때가 많죠? 특히 상속 관계에서 thissuper는 더욱 혼란스럽게 느껴질 수 있어요. 그런 여러분의 궁금증을 해결해드리기 위해, 오늘 포스팅에서는 this 키워드super 키워드의 역할을 명확하게 구분하고, 실제 코드 예시를 통해 각 키워드를 언제 어떻게 사용해야 하는지 자세히 살펴보도록 할게요. ☕️ 자, 그럼 흥미진진한 Java의 세계로 함께 떠나볼까요?

 

 

this 키워드의 역할

자바 프로그래밍에서 this 키워드는 마법처럼 다양한 상황에서 활약하는 멋진 도구예요! 마치 요술봉처럼 말이죠! ✨ 이 작은 단어 하나가 객체 자신의 참조를 나타낸다는 사실, 알고 계셨나요? this 키워드를 제대로 이해하면 코드가 훨씬 명확해지고, 객체지향 프로그래밍의 진수를 맛볼 수 있답니다. 😋 자, 이제 this 키워드의 비밀을 하나씩 풀어볼까요?

멤버 변수 가리키기

먼저, this 키워드는 현재 객체의 멤버 변수(인스턴스 변수)를 가리킬 때 사용해요. 클래스 내부에서 메서드를 정의할 때, 매개변수 이름과 멤버 변수 이름이 같을 수 있잖아요? 이럴 때 멤버 변수임을 명확하게 하기 위해 this를 붙여주는 거죠! 예를 들어, name이라는 멤버 변수와 setName(String name)이라는 메서드가 있다고 생각해 보세요. 메서드 내부에서 name = name; 이라고 하면, 이건 매개변수 name에 자기 자신을 대입하는 것과 같아서 멤버 변수 name의 값은 변하지 않아요. 하지만 this.name = name; 이라고 하면 멤버 변수 name에 매개변수 name의 값을 대입하게 되는 거죠! 이처럼 this 키워드는 변수의 모호성을 없애주는 역할을 한답니다! 👍

생성자에서 다른 생성자 호출

두 번째로, this 키워드는 생성자에서 다른 생성자를 호출할 때도 사용할 수 있어요. 생성자 오버로딩(overloading)을 할 때, 여러 생성자 간에 공통된 초기화 코드가 있을 수 있죠? 이런 경우, this()를 사용하면 중복 코드를 줄이고 효율적인 코드를 작성할 수 있어요. 예를 들어, 매개변수가 없는 생성자에서 this("기본값"); 처럼 다른 생성자를 호출하면, “기본값”을 매개변수로 받는 생성자가 호출되고, 공통된 초기화 작업을 수행하게 되는 거죠. 마치 릴레이 경주처럼 말이에요! 🏃‍♂️🏃‍♀️

현재 객체 참조 전달

세 번째로, this 키워드는 현재 객체의 참조를 다른 메서드에 전달할 때 유용하게 사용될 수 있어요. 때로는 현재 객체 자체를 다른 객체의 메서드에 전달해야 할 경우가 있죠. 이때 this 키워드를 사용하면 간단하게 현재 객체의 참조를 전달할 수 있답니다. 마치 자기소개를 하는 것처럼 말이죠! “안녕하세요, 저는 this입니다!” 👋

구체적인 예시

자, 이제 좀 더 구체적인 예시를 살펴볼까요? 만약 우리가 Person이라는 클래스를 만들고, nameage라는 멤버 변수를 가지고 있다고 가정해 봅시다. 그리고 setName(String name)setAge(int age)라는 메서드를 통해 이 값들을 설정하고 싶다면 어떻게 해야 할까요? 바로 this 키워드를 사용하면 됩니다! this.name = name; 처럼 말이죠! 이렇게 하면 메서드의 매개변수 name과 멤버 변수 name을 구분할 수 있어요. 마치 이름표를 붙여주는 것과 같죠! 🏷️

this 키워드는 생성자에서도 유용하게 활용될 수 있어요. 만약 Person 클래스에 Person(String name)Person(String name, int age) 두 개의 생성자가 있다고 해봅시다. Person(String name) 생성자에서 this(name, 20);과 같이 this()를 사용하면, name과 기본 나이 20을 가진 다른 생성자를 호출할 수 있어요. 이처럼 this()를 사용하면 중복 코드를 줄이고, 효율적인 코드를 작성할 수 있답니다. 마치 마법처럼 말이죠! ✨

this 키워드는 마치 자바 언어의 숨겨진 보석과도 같아요.💎 처음에는 조금 낯설게 느껴질 수 있지만, 익숙해지면 코드를 더욱 간결하고 명확하게 작성할 수 있도록 도와준답니다. this 키워드를 잘 활용해서 여러분의 자바 프로그래밍 실력을 한 단계 업그레이드해보세요! 🚀 다음에는 super 키워드에 대해 알아볼 거예요! 기대해주세요! 😉

 

super 키워드의 역할

자, 이번에는 Java의 핵심 키워드 중 하나인 super에 대해 자세히 알아보도록 할게요! 마치 마법 지팡이처럼, super 키워드는 상속 관계에 있는 클래스들 사이에서 부모 클래스의 멤버(필드, 메서드, 생성자)에 접근할 수 있도록 해주는 강력한 도구랍니다. 상속이 뭔지 기억나시나요? 마치 자녀가 부모로부터 특징을 물려받듯이, 자식 클래스가 부모 클래스의 특징(멤버)을 물려받는 것을 상속이라고 하죠. 이때, super 키워드는 자식 클래스가 부모 클래스의 멤버를 사용할 수 있도록 다리를 놓아주는 역할을 해요. 얼마나 편리한지 몰라요!

super 키워드는 크게 세 가지 상황에서 유용하게 사용될 수 있어요. 마치 삼총사처럼 말이죠!

super 키워드의 사용 경우

첫 번째는 부모 클래스의 필드에 접근할 때, 두 번째는 부모 클래스의 메서드를 호출할 때, 그리고 마지막 세 번째는 부모 클래스의 생성자를 호출할 때랍니다. 각각의 경우를 하나씩 살펴보면서 super 키워드의 매력에 푹 빠져보도록 해요~?

1. 부모 클래스의 필드 접근

자식 클래스에서 부모 클래스의 필드와 이름이 같은 필드를 선언하는 경우가 종종 있죠? 이럴 때 super.필드명을 사용하면 부모 클래스의 필드에 직접 접근할 수 있답니다. 마치 부모님께 직접 용돈을 받는 것처럼 말이죠! 예를 들어, 부모 클래스에 name이라는 필드가 있고, 자식 클래스에도 name이라는 필드가 있다면, 자식 클래스에서 super.name은 부모 클래스의 name 필드를 가리키고, this.name은 자식 클래스의 name 필드를 가리키게 된답니다. 참 쉽죠?!

2. 부모 클래스의 메서드 호출

자식 클래스에서 부모 클래스의 메서드와 이름, 매개변수 타입, 그리고 개수까지 모두 같은 메서드를 재정의(오버라이딩)하는 경우가 있어요. 이때 super.메서드명()을 사용하면 부모 클래스의 원래 메서드를 호출할 수 있답니다. 마치 부모님의 비법 레시피를 그대로 따라 하는 것과 같아요! 자식 클래스에서 기능을 확장하거나 변경하면서도 부모 클래스의 기존 기능을 그대로 활용할 수 있다는 점에서 매우 효율적이에요. 개발 시간을 단축시켜주는 효자 키워드라고 할 수 있죠! 만약 부모 클래스의 printInfo() 메서드를 자식 클래스에서 재정의했다면, 자식 클래스의 printInfo() 메서드 내에서 super.printInfo()를 호출하여 부모 클래스의 printInfo() 메서드를 실행할 수 있답니다.

3. 부모 클래스의 생성자 호출

모든 클래스에는 생성자가 존재하죠? 자식 클래스의 생성자는 항상 부모 클래스의 생성자를 먼저 호출해야 한답니다. 마치 자녀가 태어나기 전에 부모가 먼저 존재해야 하는 것과 같은 이치예요! 자식 클래스의 생성자 첫 줄에 super()를 명시적으로 작성하면 부모 클래스의 기본 생성자를 호출할 수 있고, super(매개변수) 형태로 작성하면 매개변수를 받는 부모 클래스의 생성자를 호출할 수 있답니다. 만약 super()를 명시적으로 작성하지 않으면 컴파일러가 자동으로 super()를 추가해 주지만, 부모 클래스에 기본 생성자가 없고 매개변수를 받는 생성자만 있는 경우에는 컴파일 에러가 발생할 수 있으니 주의해야 해요!! super()를 사용하면 부모 클래스의 초기화 로직을 재사용할 수 있어 코드 중복을 줄이고 유지보수성을 향상시킬 수 있답니다. 정말 효율적이죠?

super 키워드는 상속 관계에서 부모 클래스의 멤버에 접근하기 위한 필수적인 도구예요. super 키워드를 잘 활용하면 코드의 재사용성을 높이고, 유지보수를 용이하게 하며, 더욱 효율적인 코드를 작성할 수 있답니다. 이제 super 키워드의 강력한 힘을 직접 경험해 보세요! 다음에는 this 키워드와 super 키워드를 비교해보면서 각 키워드의 특징과 사용 시점을 더욱 명확하게 이해해 보도록 할게요! 기대해 주세요~?!

 

this와 super 비교: 언제 어떤 키워드를 사용해야 할까요?

자, 이제 this와 super 키워드의 차이점을 어느 정도 이해하셨을 거예요! 그렇다면 이 둘을 언제, 어떻게 사용해야 할지 좀 더 자세히 알아볼까요? 마치 운전면허를 딴 후 실제 도로에서 운전하는 것과 같아요. 운전면허 시험을 통과했어도 실제 도로 주행은 또 다른 차원의 연습이 필요하잖아요? this와 super도 마찬가지랍니다. 개념을 아는 것과 실제로 활용하는 것은 완전히 다른 영역이죠!

this 키워드

this 키워드는 현재 객체를 가리키는 마법 지팡이 같아요. 객체 내부에서 멤버 변수나 메서드에 접근할 때, this를 사용하면 컴파일러에게 “내 안에 있는 이 녀석을 사용할 거야!”라고 명확하게 알려줄 수 있답니다. 특히 지역 변수와 멤버 변수의 이름이 같을 때 this 없이는 멤버 변수에 접근할 수 없어요. 마치 쌍둥이에게 각각 이름표를 붙여 구분하는 것처럼 말이죠. 또한, this 키워드를 사용하여 생성자 chaining(연쇄)을 할 수 있어요. 한 생성자에서 다른 생성자를 호출하여 코드 중복을 줄이는 효과적인 방법이죠! 마치 도미노처럼 하나의 생성자가 다른 생성자를 호출하여 멋진 효과를 만들어낸답니다. 생성자 오버로딩 시, this()를 활용하여 간결하고 효율적인 코드를 작성할 수 있어요. 코드 라인 수가 줄어드니 얼마나 깔끔해 보이는지! 효율은 덤이겠죠? ^^

super 키워드

반면 super 키워드는 부모 클래스를 향한 텔레파시 같아요. 부모 클래스의 멤버 변수나 메서드를 사용하고 싶을 때 super를 사용하면 된답니다. “부모님, 저 이거 좀 써도 될까요?” 하고 정중하게 물어보는 것과 같죠. 특히 오버라이딩된 메서드에서 super를 사용하면 부모 클래스의 원래 메서드를 호출할 수 있어요. 자식 클래스에서 기능을 확장하면서도 부모 클래스의 기능을 그대로 유지할 수 있으니 얼마나 편리한가요?! 마치 레고 블록처럼 기존 블록 위에 새로운 블록을 쌓아 더 멋진 작품을 만드는 것과 같아요. super()를 사용하여 부모 클래스의 생성자를 명시적으로 호출할 수도 있어요. 부모 클래스의 초기화 로직을 그대로 사용하면서 자식 클래스의 특성을 추가할 수 있으니 일석이조의 효과를 누릴 수 있답니다!

this와 super 비교 정리

자, 이제 this와 super의 역할을 명확히 구분할 수 있겠죠? 둘 다 객체 지향 프로그래밍에서 매우 중요한 역할을 하지만, 사용하는 목적은 다르다는 것을 기억하세요! this는 현재 객체, super는 부모 클래스를 참조한다는 점, 꼭 기억해 두세요! 이 둘을 적절히 활용하면 코드의 가독성과 유지 보수성을 높일 수 있답니다!

표로 정리해보면 다음과 같아요.

키워드 역할 사용 시점
this 현재 객체 참조 현재 객체의 멤버에 접근할 때, 생성자 chaining
super 부모 클래스 참조 부모 클래스의 멤버에 접근할 때, 오버라이딩된 메서드에서 부모 클래스 메서드 호출

this와 super 활용 예시

이해하기 쉽도록 몇 가지 예시를 들어볼까요? 만약 자동차 클래스를 상속받아 스포츠카 클래스를 만든다고 가정해 봐요. 스포츠카 클래스에서 속도를 나타내는 speed라는 변수를 추가하고, 부모 클래스의 getSpeed() 메서드를 오버라이딩하여 스포츠카의 속도를 반환하도록 한다면, this와 super를 어떻게 사용해야 할까요? 스포츠카 클래스 내부에서 speed 변수에 접근할 때는 this.speed를 사용해야 하고, 오버라이딩된 getSpeed() 메서드에서 부모 클래스의 getSpeed() 메서드를 호출할 때는 super.getSpeed()를 사용해야 한답니다. 이처럼 this와 super를 적재적소에 사용하면 코드의 의도를 명확하게 표현할 수 있어요.

마치 요리 레시피처럼, this와 super라는 재료를 적절히 사용해야 맛있는 프로그램을 만들 수 있는 것과 같아요! 처음에는 어렵게 느껴질 수 있지만, 꾸준히 연습하다 보면 어느새 자유자재로 활용하는 자신을 발견하게 될 거예요! 혹시 헷갈리는 부분이 있다면, 언제든지 다시 돌아와서 복습해도 좋아요! 다음에는 실제 코드 예시를 통해 this와 super의 활용법을 더 자세히 알아볼 테니 기대해 주세요~?

 

실제 코드 예시로 this와 super 이해하기

자, 이제까지 thissuper 키워드에 대해 추상적으로 알아봤으니, 실제 코드를 통해 좀 더 명확하게 이해해 보도록 할까요? 백문이 불여일견이라는 말도 있잖아요? ^^ 복잡한 개념도 코드 예시를 보면 훨씬 쉽게 와닿는 법이죠! 그럼, 바로 시작해 볼게요!

1. this 키워드 활용 예시: 필드와 지역 변수 구분하기

클래스 내에서 필드와 지역 변수의 이름이 같을 때, this 키워드는 필드를 명시적으로 참조하는 데 유용하게 쓰여요. 이렇게 하면 변수 이름의 모호성을 제거하고 코드의 가독성을 높일 수 있답니다. 아래 코드를 볼까요?

public class Person {
    private String name; // 필드

    public Person(String name) {
        this.name = name; // this 키워드를 사용하여 필드 name에 접근
    }

    public void printName() {
        String name = "Local Name"; // 지역 변수
        System.out.println("지역 변수 name: " + name); // 지역 변수 출력
        System.out.println("필드 name: " + this.name); // this 키워드를 사용하여 필드 name 출력
    }

    public static void main(String[] args) {
        Person person = new Person("John Doe");
        person.printName();
    }
}

Person 클래스의 생성자에서 this.name = name; 부분을 눈여겨보세요! 매개변수 name과 필드 name이 동일한 이름을 가지고 있죠? 이때 this.name은 필드 name을, name은 매개변수 name을 가리킨답니다. 만약 this 키워드를 사용하지 않으면 지역 변수에 값이 할당되어 원하는 결과를 얻지 못할 수도 있어요! printName() 메서드에서도 this 키워드를 사용하여 필드 name에 접근하는 것을 확인할 수 있죠?

2. super 키워드 활용 예시: 상속과 메서드 오버라이딩

super 키워드는 상속 관계에서 부모 클래스의 멤버에 접근할 때 사용해요. 특히, 자식 클래스에서 부모 클래스의 메서드를 오버라이딩할 때, super 키워드를 사용하여 부모 클래스의 원래 메서드를 호출할 수 있답니다. 얼마나 편리한지 몰라요!

class Animal {
    public void makeSound() {
        System.out.println("Generic animal sound");
    }
}

class Dog extends Animal {
    @Override
    public void makeSound() {
        super.makeSound(); // 부모 클래스의 makeSound() 메서드 호출
        System.out.println("Woof!");
    }


    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.makeSound();  // 출력: Generic animal sound, Woof!
    }
}

Dog 클래스는 Animal 클래스를 상속하고 makeSound() 메서드를 오버라이딩하고 있어요. Dog 클래스의 makeSound() 메서드 내에서 super.makeSound()를 호출함으로써 부모 클래스의 makeSound() 메서드를 실행하고, 그 후 “Woof!”를 출력하도록 했죠. 이처럼 super 키워드를 사용하면 부모 클래스의 기능을 재사용하면서 자식 클래스에 특화된 기능을 추가할 수 있어 효율적인 코드 작성이 가능해진답니다. 정말 유용하지 않나요?!

3. this() 와 super() 생성자 chaining

생성자 chaining은 한 생성자에서 다른 생성자를 호출하는 것을 의미해요. this()는 같은 클래스 내의 다른 생성자를 호출하는 데 사용되고, super()는 부모 클래스의 생성자를 호출하는 데 사용된답니다. 이를 통해 코드 중복을 줄이고, 효율적인 객체 초기화를 가능하게 하죠! 아래 예시를 함께 살펴볼까요?

class Vehicle {
    private String model;
    private int year;

    public Vehicle(String model, int year) {
        this.model = model;
        this.year = year;
    }

    public Vehicle(String model) {
        this(model, 2024);  // this()를 사용하여 다른 생성자 호출
    }
}

class Car extends Vehicle {
    private String color;

    public Car(String model, int year, String color) {
        super(model, year); // super()를 사용하여 부모 클래스의 생성자 호출
        this.color = color;
    }

    public Car(String model, String color) {
        this(model, 2024, color);
    }

    public Car(String model) {
        this(model, "Silver"); // 다른 생성자 호출 (Car(String model, String color) 호출)
    }
}

Vehicle 클래스의 두 번째 생성자 Vehicle(String model)this(model, 2024)를 통해 첫 번째 생성자를 호출하고 있어요. Car 클래스의 생성자에서는 super(model, year)를 통해 부모 클래스인 Vehicle 클래스의 생성자를 호출하고 있죠. 생성자 chaining은 객체 초기화 과정을 간결하고 명확하게 만들어준답니다! 이처럼 this()super()를 적절히 활용하면 코드의 재사용성과 가독성을 높일 수 있어요.

이처럼 thissuper 키워드는 Java 프로그래밍에서 매우 중요한 역할을 담당하고 있어요. 다양한 상황에서 적절하게 활용하면 코드의 효율성과 가독성을 크게 향상시킬 수 있죠! 이제 여러분도 thissuper 키워드를 자유자재로 사용해서 멋진 Java 코드를 작성해 보세요~! 😊

 

자, 이제 thissuper! 완벽하게 이해했죠? 처음엔 조금 헷갈릴 수 있지만, 이 두 키워드는 자바의 상속과 객체지향 프로그래밍을 이해하는 데 정말 중요한 열쇠랍니다. 마치 마법 주문처럼, this는 현재 객체를, super는 부모 클래스를 가리키는 멋진 기능을 한답니다. 이 블로그 글이 여러분의 궁금증 해결에 도움이 되었기를 바라요. 앞으로 코딩하면서 thissuper를 만나면 자신 있게 활용해 보세요! 훨씬 더 효율적이고 깔끔한 코드를 작성할 수 있을 거예요. 다음에 또 유익한 정보로 찾아올게요!

 

Leave a Reply

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다