💡 오버라이딩과 오버로딩
1. 오버라이딩(Overriding) : 오버라이딩은 서브 클래스(subclass)가 상위 클래스(superclass)로부터 상속받은 메소드를 자신만의 버전으로 다시 구현하는 과정입니다. 즉, 메소드의 이름은 동일하게 선언되며, 매개변수와 반환 타입도 동일한 형식을 가져야 합니다.
오버라이딩을 사용하면 하위 클래스에서 상위 클래스의 메소드를 변경하거나 수정할 수 있습니다. 이는 다형성(polymorphism) 구현에 중요한 역할을 하며, 서브 클래스 객체를 바탕으로 상위 클래스의 참조 변수를 사용하여 호출 시, 실행되는 메소드가 오버라이딩된 메소드임을 보장합니다.
2. 오버로딩(Overloading) : 오버로딩은 같은 이름의 메소드를 한 클래스 내에서 여러 개 선언하는 것을 말합니다. 단, 각 메소드는 매개변수의 타입, 개수, 순서 등이 서로 다르게 선언되어야 합니다. 이를 통해 같은 이름의 메소드를 다양한 매개변수 조합으로 사용할 수 있습니다. 어떤 메소드가 호출될지는 전달되는 매개변수에 의해 결정됩니다.
오버로딩을 사용하면 메소드 이름을 기억하기 쉽게 정할 수 있으며, 동일한 작업 수행에 대해 편의성이 증가합니다. 이 역시 Java의 다형성을 구현하는 방법 중 하나입니다.
구분 | 오버라이딩 | 오버로딩 |
메소드 이름 | 동일 | 동일 |
매개변수 (타입, 개수, 순서) | 동일 | 다름 |
반환 타입 | 동일 | 상관없음 |
💡 final 키워드
Java에서 final 키워드는 클래스, 메소드, 변수에 사용할 수 있습니다.
1. 클래스 : 변경될 수 없는 클래스, 확장될 수 없는 클래스가 됩니다. 그래서 final로 선언된 클래스는 다른 클래스의 조상이 될 수 없습니다.
2. 메소드 : 변경될 수 없는 메소드, 해당 메소드의 구현 내용을 하위 클래스에서 변경할 수 없게 됩니다. 즉, 해당 메소드를 오버라이딩 하지 못하게 됩니다.
3. 변수 : 값을 변경할 수 없는 상수가 됩니다.
final 키워드는 불변성 (Immutability)을 유지하거나, 부모 클래스/메소드를 변경하지 못하도록 보호하거나, 특정한 메소드나 클래스가 자식 클래스/인터페이스에 의해서 변경되는 것을 방지하고자 할 때 사용됩니다.
💡 접근 제어자 (access modifier)
- public : 어떤 클래스에서도 접근할 수 있습니다.
- protected : 같은 패키지 내에서, 패키지가 다른 경우, 자식 클래스에서만 접근이 가능합니다.
- default : 같은 패키지 내에서만 접근이 가능합니다. 접근 제어자를 따로 지정하지 않은 경우, default 접근 제어자로 지정됩니다.
- private : 해당 멤버 변수나 메소드를 선언한 클래스 내에서만 사용할 수 있습니다.
제어자 | 같은 클래스 | 같은 패키지 | 자식 클래스 | 전체 |
public | ⭕ | ⭕ | ⭕ | ⭕ |
protected | ⭕ | ⭕ | ⭕ | |
(default) | ⭕ | ⭕ | ||
private | ⭕ |
접근 제어자를 사용하는 이유는 클래스의 내부에 선언된 데이터를 보호하고 유지 보수를 용이하게 하는 등의 장점이 있습니다. 이러한 접근 제어자와 관련된 개념으로 캡슐화(Encapsulation)가 있습니다. 캡슐화는 클래스의 내부 구현을 외부로부터 감출 수 있게 하여 외부의 영향을 최소화하는 방법입니다. 이를 통해 프로그램의 안정성과 확장성을 높이게 됩니다.
💡 클래스, 객체, 인스턴스
클래스(Class)와 객체(Object), 인스턴스(Instance)는 객체지향 프로그래밍(Object-Oriented Programming, OOP)에서 핵심 개념입니다.
1. 클래스(Class)는 객체를 생성하기 위한 설계도라고 할 수 있습니다. 클래스에는 객체가 가져야 할 속성과 기능(메소드)들이 정의되어 있습니다. 클래스는 객체에 대한 정보와 논리를 담고 있으며, 코드를 재사용하기도 쉽습니다.
2. 객체(Object)는 클래스로부터 만들어지는 실체입니다. 객체는 독립적이며, 각기 다른 상태를 가질 수 있습니다.
3. 인스턴스(Instance)는 클래스를 바탕으로 메모리에 실제로 할당된 객체를 의미합니다. 인스턴스는 독립적이며, 각기 다른 상태를 가질 수 있습니다. 객체와 같은 의미로 쓰이기도 합니다.
💡 Java에서 제공하는 원시 타입들에 무엇이 있고, 각각 몇 바이트를 차지하나요?
Java의 원시 타입(Primitive Types)은 기본적인 데이터 유형으로, 각각의 크기는 플랫폼에 따라 다를 수 있습니다. 일반적으로는 아래의 크기가 대부분의 플랫폼에서 일관되게 적용됩니다.
정수형 byte, short, int, long / 실수형 float, double / 문자형 char / 논리형 boolean이 있고,
정수형 1, 2, 4, 8, 실수형 4, 8, 문자형 2, 논리형 1 바이트를 차지합니다.