티스토리 뷰
프로그래밍을 하다보면 이런저런 상황에 이름이 겹치는 경우가 발생한다. 가장 대표적인건 오버라이딩이나 오버로딩과 같은 것들도 이름이 겹치는걸 활용한 기법이라고 볼 수 있다. 그 용어들에 대한 내용을 정리한다.
1. 오버라이딩
하위 클래스에서 상위 클래스 혹은 인터페이스의 메서드 시그니처를 동일하게 작성하여 말 그대로 메서드를 재정의 하는 것. 어떤 메서드를 호출할지는 동적으로 정해지며(동적 디스패치) 다형성의 핵심이 되는 기능.
* 동적디스패치 포스팅 : http://multifrontgarden.tistory.com/133
interface Testable{
void test();
}
class OverrideTest implements Testable{
@Override
public void test() {
System.out.println("Hello Override");
}
}
2. 오버로딩
메서드의 이름은 같게하고 인자의 타입이나 개수를 달리 정의하여 동일한 이름으로 여러 메서드를 정의하는 기능. 어떤 메서드를 호출할지는 정적으로 정해짐.
class OverloadTest {
public void test(int number) {
System.out.println("Hello Overload :: " + number);
}
public void test(String string) {
System.out.println("Hello Overload :: " + string);
}
}
3. 하이딩
오버라이딩이 되는 대상은 일반 메서드이다. 일반메서드를 제외한 필드, 정적 메서드 등을 하위 클래스에서 동일한 명칭으로 선언하면 하이딩이 발생한다.
public class Test {
public static void main(String[] args) {
// Super#test 메서드를 Sub#test 메서드가 하이딩한다.
Sub.test();
// Super#test 를 호출하려면 Super를 써야한다.
Super.test();
}
}
class Super {
public static void test() {
System.out.println("hello world");
}
}
class Sub extends Super {
public static void test() {
System.out.println("goodbye world");
}
}
4. 섀도윙
변수나 메서드, 클래스, 인터페이스의 명칭을 같은 영역에서 동일하게 사용할 경우 발생. 기본적으론 권장하지않는 사용이지만 대표적으로 생성자나 getter, setter 에서 많이 사용한다.
class Person {
private String name;
public Person(String name) {
// 이것도 섀도윙이다. name을 내부 스코프에서 가려버렸기때문에 외부 스코프참조를 위해 this를 이용한다.
this.name = name;
}
}
5. 모호화
변수나 클래스, 인터페이스의 이름이 같은 경우를 말한다. 보통은 변수를 가장 우선적으로 찾게되는데 기본적인 네이밍 컨벤션만 잘 지켜도 이런일이 발생할 경우는 거의 없다.
* 클래스는 대문자로시작, 변수는 소문자로시작 등
class Person {
private String Person;
public static void method(){
System.out.println("hello world");
}
public Person(){
// 정적 메서드인 method를 호출하고싶지만 Person은 클래스가 아니라 변수를 선택하므로 호출할 수 없다.
Person.trim();
// method를 호출하기위해선 패키지명까지 정해줘서 명확하게 표현해줘야한다.
com.main.java.Person.method();
}
}
참고
'Java' 카테고리의 다른 글
Jackson Serialize 시 클래스 정보가 필요할때 (0) | 2017.12.28 |
---|---|
Objects 클래스 (3) | 2017.12.21 |
nio 패키지를 이용한 텍스트 파일 입출력 (0) | 2017.10.09 |
중첩 try with resources 는 어떻게 작동할까? (5) | 2017.09.26 |
Utils 클래스 리팩토링 (0) | 2017.08.27 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- frontcode
- EffectiveJava
- MySQL
- OOP
- clean code
- backend개발환경
- servlet
- generics
- Design Pattern
- java8
- Git
- JavaScript Core
- 정규표현식
- JPA
- go-core
- db
- programming
- java
- http
- code
- Jackson
- Kotlin
- DesignPattern
- frontend개발환경
- toby
- javascript
- mariadb
- spring cloud
- TEST
- Spring
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
글 보관함