-
[Java] 상속(Inheritance)과 메소드 오버라이딩 vs 오버로딩Java 2023. 7. 20. 09:30728x90반응형
자바의 상속과 메소드 오버라이딩(Overriding) vs 오버로딩(Overloading)
안녕하세요 🙃 오늘은 자바의 꽃 상속에 대해서 배워봤어요. 자바는 객체 지향 프로그래밍 언어로, 상속은 객체 지향 프로그래밍의 중요한 개념 중 하나입니다. 상속은 코드 재사용성과 유지 보수를 향상시키는 중요한 역할을 합니다. 이번 포스팅에서는 자바에서 상속의 개념과 이점에 대해 알아보고, 실제 예제 코드를 통해 상속을 적용하는 방법을 알아볼게요 🧐
🍊 상속(Inheritance)이란?
상속은 클래스가 다른 클래스의 특성과 동작을 물려받는 것을 의미합니다. 상속을 통해 기존 클래스의 코드를 재사용하여 새로운 클래스를 만들 수 있습니다. 이때 기존 클래스는 슈퍼 클래스 또는 부모 클래스라고 하며, 새로운 클래스는 서브 클래스 또는 자식 클래스라고 합니다.
📍 상속의 장점
🔗 코드 재사용
기존의 클래스를 확장하여 새로운 클래스를 생성하므로 중복된 코드를 피하고 재사용성을 높일 수 있습니다.
🔗 유지 보수 용이성
공통적인 기능이 슈퍼 클래스에 있으므로 해당 기능을 수정해야 할 때 서브 클래스들도 자동으로 업데이트됩니다.
🔗 다형성
서브 클래스는 슈퍼 클래스의 타입으로 사용될 수 있으며, 이를 통해 유연하고 확장성 있는 프로그래밍이 가능합니다.
📍 실습 코드
"동물" 클래스를 상속받아 "고양이" 클래스를 만드는 예제입니다.
javaCopy code // 동물 클래스 class Animal { String name; Animal(String name) { this.name = name; } void makeSound() { System.out.println("동물이 소리를 내고 있습니다."); } } // 고양이 클래스, 동물 클래스를 상속받음 class Cat extends Animal { Cat(String name) { super(name); } // 동물 클래스의 makeSound() 메서드를 오버라이드(재정의)하여 고양이의 소리로 변경 @Override void makeSound() { System.out.println(name + "가 야옹 소리를 내고 있습니다."); } void scratch() { System.out.println(name + "가 발톱을 강하게 세웠습니다."); } } public class Main { public static void main(String[] args) { // 고양이 객체 생성 Cat cat = new Cat("야옹이"); // 고양이 객체의 메서드 호출 cat.makeSound(); // 출력: 야옹이가 야옹 소리를 내고 있습니다. cat.scratch(); // 출력: 야옹이가 발톱을 강하게 세웠습니다. } }
위 예제에서 Animal 클래스는 name 필드와 makeSound() 메서드를 갖고 있습니다. Cat 클래스는 Animal 클래스를 상속받아 scratch() 메서드를 추가로 가지고 있습니다. Cat 클래스에서 makeSound() 메서드를 오버라이드하여 동물의 소리 대신 고양이의 소리로 출력되도록 변경했습니다.
📍 슈퍼클래스와 서브클래스, extends
- 슈퍼 클래스 : 부모 클래스 (super class)
- 서브 클래스 : 상속받는 자식 클래스 (sub class)
- extends : 상속을 선언할 때 확장한다는 의미로 사용하는 extends 키워드
📍 상속 사용해보기
class Point { private int x, y; // 한 점을 구성하는 x, y 좌표 public void set(int x, int y) { this.x = x; this.y = y; } public void showPoint() { // 점의 좌표 출력 System.out.println("(" + x + ", " + y + ")"); } } class ColorPoint extends Point { // Point를 상속받은 ColorPoint 선언 private String color; // 점의 색 public void setColor(String color) { this.color = color; } public void showColorPoint() { // 컬러 점의 좌표 출력 System.out.println(color); showPoint(); // Point 클래스의 showPoint() 호출 } }
(x, y)의 한 점을 표현하는 Point 클래스와 이를 상속받아 색을 가진 점을 표현하는 ColorPoint 클래스를 만들고 활용해보는 코드입니다.
public class ColorPointEx { public static void main (String[] args) { Point p = new Point(); // Point 객체 생성 p.set(1, 2); // Point 클래스의 set() 호출 p.showPoint(); ColorPoint cp = new ColorPoint(); // ColorPoint 객체 생성 cp.set(3, 4); // Point 클래스의 set() 호출 cp.setColor("red"); // ColorPoint 클래스의 setColor() 호출 cp.showColorPoint(); // 컬러와 좌표 출력 } }
위와 같이 cp 객체를 구성하는 ColorPoint 클래스의 public 멤버와 슈퍼 클래스인 Point 클래스의 public 멤버를 모두 접근할 수 있습니다. 그러나 x, y, color 필드는 private 속성이므로 접근할 수 없습니다.
🍊 동적 바인딩 vs 정적 바인딩
📍 동적 바인딩 : 오버라이딩된 메소드 호출
동적 바인딩(dynamic binding)은 실행할 때 메소드를 컴파일 시(compile time)에 결정하지 않고 실행 시(run time)에 결정하는 것을 말합니다. 자바에서는 동적 바인딩을 통해 오버라이딩된 메소드가 항상 실행되도록 보장합니다.
📍 정적 바인딩 : super 키워드로 슈퍼클래스에 접근하기
자바에서는 동적 바인딩에 의해 항상 서브 클래스에 오버라이딩한 메소드가 호출됩니다. 그러면 슈퍼 클래스의 메소드에 접근하려면 어떻게 해야 할까요? 아래처럼 super 키워드를 이용하면 됩니다.
super.슈퍼클래스의멤버
📍 슈퍼클래스에 대한 접근자 super
super는 자바 컴파일러에 의해 지원되는 것으로 슈퍼 클래스에 대한 레퍼런스입니다. super를 이용하면 슈퍼 클래스의 필드와 메소드에 모두 접근할 수 있습니다.
name = "Circle"; // Circle 클래스의 name에 "Circle" 기록 super.name = "Shape"; // Shape 클래스의 name에 "Shape" 기록 super.draw(); // Shape 클래스의 draw() 호출. 정적 바인딩
🍊 오버로딩(overloading)과 오버라이딩(overriding)
오버로딩과 오버라이딩은 자바에서 다형성을 이루는 방법입니다.
📍 오버라이딩 Overriding
오버라이딩은 상위 클래스에서 정의된 메소드를 하위 클래스에서 재정의하는 것을 의미합니다.
javaCopy code class Animal { public void makeSound() { System.out.println("Some generic sound"); } } class Dog extends Animal { // Animal 클래스의 makeSound 메서드를 오버라이딩함 @Override public void makeSound() { System.out.println("Bark! Bark!"); } } class Cat extends Animal { // Animal 클래스의 makeSound 메서드를 오버라이딩함 @Override public void makeSound() { System.out.println("Meow!"); } } public class Main { public static void main(String[] args) { Animal animal1 = new Dog(); Animal animal2 = new Cat(); animal1.makeSound(); // 출력 결과: "Bark! Bark!" animal2.makeSound(); // 출력 결과: "Meow!" } }
📍 오버로딩 Overloading
오버로딩은 같은 이름의 메소드를 매개변수의 타입이나 개수가 다른 형태로 여러 개 정의하는 것을 의미합니다.
public class Calculator { // 정수형 두 개를 더하는 메서드 public int add(int a, int b) { return a + b; } // 실수형 두 개를 더하는 메서드 public double add(double a, double b) { return a + b; } // 문자열을 이어붙이는 메서드 public String add(String a, String b) { return a + b; } public static void main(String[] args) { Calculator calculator = new Calculator(); int sum1 = calculator.add(3, 5); double sum2 = calculator.add(2.5, 3.7); String result = calculator.add("Hello, ", "world!"); System.out.println("Sum of integers: " + sum1); System.out.println("Sum of doubles: " + sum2); System.out.println("Concatenated string: " + result); } }
🍊 요약
자바의 상속과 메소드 오버라이딩과 오버로딩은 객체 지향 프로그래밍의 중요한 개념들로서 코드의 재사용성과 유연성을 높이는 데 도움이 됩니다. 상속을 통해 코드를 재활용하고, 동적 바인딩을 통해 실행 시점에 메소드를 연결하는 다형성을 지원합니다. 정적 바인딩은 컴파일 시점에 메소드를 연결하며, 오버라이딩은 상위 클래스의 메소드를 하위 클래스에서 재정의하여 다형성을 구현합니다. 오버로딩은 같은 이름의 메소드를 매개변수의 타입이나 개수가 다른 형태로 정의하여 다양한 입력을 처리할 수 있습니다.
LIST'Java' 카테고리의 다른 글
[Java] 자바의 접근 제한자, 싱글톤 패턴으로 객체 instance 생성하기 (1) 2023.07.22 [Java] OOP 추상클래스와 인터페이스 (1) 2023.07.21 [Java] 자바의 정수와 실수의 계산, 부동 소수점 방식 (0) 2023.07.17 [Java] 자바의 조건문과 반복문의 이해와 활용 (for, while, if, swtich) (2) 2023.07.16 [Java] 자바의 연산자 (곱셈, 나눗셈, 덧셈, 비트연산자, 삼항연산자) (2) 2023.07.14