제 4장: 객체를 더 깊이 이해하기
4장에서는 자바에서 객체를 더 깊이 이해하고 활용하는 방법을 다룬다. 주요 내용은 다음과 같다:
메서드 오버로딩
- 메서드 오버로딩: 같은 이름의 메서드를 여러 개 정의할 수 있는 기능으로, 매개변수의 타입이나 개수에 따라 서로 다른 메서드를 호출할 수 있게 한다. 이는 코드의 가독성을 높이고, 동일한 작업을 다양한 방식으로 수행할 수 있게 한다.
메서드 오버로딩의 규칙
- 메서드 이름은 동일해야 한다.
- 매개변수의 타입이나 개수가 달라야 한다.
- 리턴 타입은 다를 수 있지만, 이것만으로 오버로딩을 구분할 수 없다.
- 접근 제어자와 예외는 오버로딩에 영향을 주지 않는다.
예제
다음은 메서드 오버로딩의 예제다:
public class MathUtils {
// 두 개의 정수를 더하는 메서드
public int add(int a, int b) {
return a + b;
}
// 세 개의 정수를 더하는 메서드
public int add(int a, int b, int c) {
return a + b + c;
}
// 두 개의 실수를 더하는 메서드
public double add(double a, double b) {
return a + b;
}
// 두 개의 문자열을 더하는 메서드
public String add(String a, String b) {
return a + b;
}
}
메서드 오버로딩의 사용
다음은 오버로딩된 메서드를 호출하는 예제다:
public class Main {
public static void main(String[] args) {
MathUtils math = new MathUtils();
// 정수 덧셈
System.out.println(math.add(2, 3)); // 출력: 5
System.out.println(math.add(2, 3, 4)); // 출력: 9
// 실수 덧셈
System.out.println(math.add(2.5, 3.5)); // 출력: 6.0
// 문자열 덧셈
System.out.println(math.add("Hello, ", "World!")); // 출력: Hello, World!
}
}
메서드 오버로딩의 장점
- 가독성: 메서드 이름을 일관성 있게 유지하면서 다양한 매개변수 조합을 처리할 수 있다.
- 유지보수성: 코드가 보다 직관적이고 관리하기 쉬워진다.
- 재사용성: 동일한 작업을 수행하는 메서드를 재사용하여 중복 코드를 줄일 수 있다.
메서드 오버라이딩
- 메서드 오버라이딩: 슈퍼 클래스의 메서드를 서브 클래스에서 재정의하는 것이다. 오버라이딩된 메서드는 서브 클래스의 객체에서 호출될 때 서브 클래스의 메서드가 실행된다.
메서드 오버라이딩의 규칙
- 메서드 이름, 매개변수 목록, 리턴 타입이 동일해야 한다.
- 접근 제어자는 동일하거나 더 넓어야 한다.
- 오버라이딩된 메서드는 슈퍼 클래스의 메서드와 동일한 예외를 던지거나 더 적은 예외를 던질 수 있다.
@Override
애너테이션을 사용해 오버라이딩을 명시하는 것이 좋다.
예제
다음은 메서드 오버라이딩의 예제다:
public class Animal {
public void makeSound() {
System.out.println("Animal sound");
}
}
public class Dog extends Animal {
@Override
public void makeSound() {
System.out.println("Woof!");
}
}
메서드 오버라이딩의 사용
다음은 오버라이딩된 메서드를 호출하는 예제다:
public class Main {
public static void main(String[] args) {
Animal animal = new Animal();
animal.makeSound(); // 출력: Animal sound
Dog dog = new Dog();
dog.makeSound(); // 출력: Woof!
}
}
메서드 오버라이딩의 장점
- 다형성: 동일한 메서드 호출이 객체의 실제 타입에 따라 다르게 동작할 수 있다.
- 유지보수성: 슈퍼 클래스의 메서드를 수정하지 않고도 서브 클래스에서 기능을 확장할 수 있다.
- 재사용성: 기존 클래스의 코드를 재사용하면서도 특정 부분의 동작을 변경할 수 있다.
접근 제어자
접근 제어자: 클래스, 변수, 메서드의 접근 범위를 제어한다.
public: 모든 클래스에서 접근 가능.
protected: 같은 패키지 내, 그리고 상속받은 클래스에서 접근 가능.
default (아무 키워드도 사용하지 않을 때): 같은 패키지 내에서만 접근 가능.
private: 해당 클래스 내에서만 접근 가능.
public class Person { private String name; protected int age; public String address; public String getName() { return name; } public void setName(String name) { this.name = name; } }
캡슐화와 정보 은닉
- 캡슐화: 데이터와 메서드를 하나의 단위로 묶고, 외부로부터 데이터를 보호하는 개념이다.
- 정보 은닉: 객체의 세부 구현 내용을 외부에 감추고, 필요한 부분만 공개하는 것.
- 캡슐화와 정보 은닉을 통해 코드의 재사용성과 유지보수성을 높일 수 있다.
this 키워드
this
키워드는 객체 자신을 가리키는 참조 변수다.인스턴스 변수와 메서드 매개변수의 이름이 같을 때 이를 구분하는 데 사용된다.
this()
는 같은 클래스의 다른 생성자를 호출할 때 사용된다.public class Dog { String name; int age; public Dog(String name, int age) { this.name = name; this.age = age; } public Dog(String name) { this(name, 0); // 다른 생성자 호출 } void printInfo() { System.out.println("Name: " + this.name); System.out.println("Age: " + this.age); } }
정적 변수와 메서드
정적 변수(클래스 변수): 클래스에 속하며, 모든 객체가 공유하는 변수.
static
키워드를 사용해 선언한다.정적 메서드(클래스 메서드): 객체 생성 없이 클래스 이름으로 호출할 수 있는 메서드. 정적 변수만 접근할 수 있다.
public class Counter { public static int count = 0; public Counter() { count++; } public static void printCount() { System.out.println("Count: " + count); } }
상속
상속: 한 클래스가 다른 클래스의 속성과 메서드를 물려받는 개념이다.
슈퍼 클래스(부모 클래스)와 서브 클래스(자식 클래스)로 구분된다.
상속을 통해 코드의 재사용성을 높이고, 계층 구조를 통해 논리적 설계를 할 수 있다.
public class Animal { String name; public void eat() { System.out.println("Eating..."); } }
public class Dog extends Animal {
public void bark() {
System.out.println("Woof!");
}
}
```
이 장은 객체 지향 프로그래밍의 핵심 개념인 메서드 오버로딩과 오버라이딩, 캡슐화, 상속, 다형성을 이해하고, 자바에서 이를 구현하는 방법을 배운다. 이를 통해 복잡한 프로그램을 보다 효율적으로 설계하고 구현할 수 있게 된다.
'RESOURCE > IT개념' 카테고리의 다른 글
@Autowired를 지양하는 이유 (0) | 2024.06.28 |
---|---|
자바 어노테이션의 원리 (0) | 2024.06.25 |
자바 프로그래밍 루프 검증 (0) | 2024.06.19 |
인스턴스란 무엇인가 (0) | 2024.06.18 |
프레임워크 vs 개발툴 (0) | 2024.06.18 |