본문 바로가기
programming

오버로딩 오버라이딩 차이와 사용이유 OverLoad OverRide

by 개코 - 개발과 코딩 2022. 2. 8.

오버로딩과 오버라이딩은 객체지향에서 난해한 언어이다. 사전적의미를 먼저 살펴보자. 오버로딩은 지나치게 많이 주다 느낌이고, 오버라이딩은 최우선하는 것으로 기존의 것을 무시한다 란 의미를 가진다. 이것을 객체지향코드로 변경하면 오버로딩은 메서드가 증가하지만 인자값이 다르고 기능이 달라진다. 오버라이딩은 부모클래스에 있던 메서드가 자식클래스에 동일하게 존재하는 경우 부모클래스의 메서드는 무시되고 자식클래스의 메서드가 우선시된다.

오버로딩 오버라이딩 차이와 사용이유
OverLoad OverRide

객체지향언어에서 난해한 단어들이 있다.

그 중 대표적인 것이 오버로딩과 오버라이딩이다.

이둘의 차이는 객체지향프로그래밍에서 중요한 개념이기도 하지만 정작 이 개념을 모르고 사용하는 경우가 많다.

그만큼 편하다는 것이고 코딩에 있어 자유도가 생긴 것이기도 하다.

지금의 개발자들은 정확한 개념을 모르더라도 오버로딩과 오버라이딩을 많이 사용하기도 한다.

단어의 뜻

사전적인 의미를 먼저 살펴보자.

IT 용어를 아는 것도 좋지만 영어를 공부한 사람이라면 1차적인 단어의 의미를 알면 편할 수 있다는 것을 알 수 있다.

먼저 over 라는 단어는 넓은 범위로 어떤 것을 덮는다는 느낌적인 것을 생각해 본다.

  • overload
    과적하다. 부과하다.
    지나치게 많이 주다
  • override
    기각하다. 무시하다
    다른 것보다 중요시하여 중단시키거나 무시하는 것

사전적 의미는 이렇다.

단어사전을 찾아보면 이것이 어떻게 it 용어에 적용되는지 선뜻 이해가 되지 않는다.

다시 생각해 보자.

overload 는 이미 가지고 있는데 더 많이 주는 것이다.

override 는 우선시 되는 어떤 것 때문에 기존의 것이 무시되는 것이다.

overload 더 많이 주다.

대표적인 객체지향 언어인 자바를 이용하여 오버로드를 만들어 보자.

객체지향언어에서의 오버로드란 같은 이름을 가진 메서드가 여러개지만 인자값이 다르며, 인자값에 따른 동작이 다른 것을 말한다.

무엇을 더 많이 주게 되는 것일까

먼저 코드를 보자.

characterInfo 클래스의 OverLoad 주석의 위치를 보도록 하자.

public class JavaTutorials {

	public static void main(String[] args) {
		
		// TODO Auto-generated method stub
		CharacterInfo _info = new CharacterInfo();
		_info.GetCharacterInfo();
		_info.GetCharacterInfo("성기사");
		_info.GetCharacterInfo(100);
		_info.GetCharacterInfo("치료사", 50);
		
    }
}

class CharacterInfo {
	
	private String name = "일반병사";
	private int attack = 10;
	
	public CharacterInfo() {}
	
	//----- OverLoad
	
	public void GetCharacterInfo() {
		System.out.println(String.format("캐릭터 : %s, 공격력 : %s", this.getName(), this.getAttack()));
	}
	
	public void GetCharacterInfo(String _name) {
		this.setName(_name);
		System.out.println(String.format("캐릭터 : %s, 공격력 : %s", this.getName(), this.getAttack()));
	}
	
	public void GetCharacterInfo(int _attack) {
		this.setAttack(_attack);
		System.out.println(String.format("캐릭터 : %s, 공격력 : %s", this.getName(), this.getAttack()));
	}
	
	public void GetCharacterInfo(String _name, int _attack) {
		this.setName(_name);
		this.setAttack(_attack);
		System.out.println(String.format("캐릭터 : %s, 공격력 : %s", this.getName(), this.getAttack()));
	}
	
	//-----
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAttack() {
		return attack;
	}
	public void setAttack(int attack) {
		this.attack = attack;
	}
}

메서드명은 같지만 받아들이는 인자값이 다르다.

어떤 것은 한개, 어떤 것은 두개 이다.

어떤 것은 한개지만 자료형이 다르다.

오버로드의 뜻을 다시 생각해보자. 더 많이 준다라는 의미이다.

같은 이름의 메서드가 증가하지만, 인자값이 다르다는 것을 알 수 있다.

메서드가 증가하는 단점이 있지만 인자값을 다르게 하여 자유도가 높은 메서드를 만들 수 있다.

이것이 오버로드의 기능이다.

결과화면을 보자.

OverRide 최우선시 하는 것으로 기존의 것을 무시한다.

오버라이드는 클래스의 상속에 자주 사용된다.

상속은 기본 클래스 객체를 바탕으로 다른 클래스를 만들면서 기능을 확장하는 개념이다.

부모클래스가 과일이고, 상속되고 확장되어 클래스는 사과 클래스, 바나나 클래스, 수박 클래스 등 많아질 것이다.

참고로 수박은 채소다.

부모클래스가 자동차이고 상속되고 확장되어 클래스는 승용차 클래스, 화물차 클래스, 승합차 클래스 등 많아질 것이다.

클래스를 상속할수록 메서드의 기능도 많아질 것이다.

오버로드만 사용해도 되겠지만 그렇지 않을 수도 있다.

아래의 코드를 보자. 위에서 사용한 오버로드 코드를 상속하여 사용했다.

extinfo 클래스만 보면 된다.

/**
 * https://www.w3schools.com/java/java_intro.asp
 */
public class JavaTutorials {

	public static void main(String[] args) {
		
		// TODO Auto-generated method stub
		CharacterInfo _info = new CharacterInfo();
		_info.GetCharacterInfo();
		_info.GetCharacterInfo("성기사");
		_info.GetCharacterInfo(100);
		_info.GetCharacterInfo("치료사", 50);
		
		// TODO Auto-generated method stub
		ExtCharInfo _extInfo = new ExtCharInfo();
		_extInfo.GetCharacterInfo();
		_extInfo.GetCharacterInfo("정치가");
		_extInfo.GetCharacterInfo(10);
		_extInfo.GetCharacterInfo("마법사", 70);
		
    }
}

class CharacterInfo {
	
	private String name = "일반병사";
	private int attack = 10;
	
	public CharacterInfo() {}
	
	//----- OverLoad
	
	public void GetCharacterInfo() {
		System.out.println(String.format("캐릭터 : %s, 공격력 : %s", this.getName(), this.getAttack()));
	}
	
	public void GetCharacterInfo(String _name) {
		this.setName(_name);
		System.out.println(String.format("캐릭터 : %s, 공격력 : %s", this.getName(), this.getAttack()));
	}
	
	public void GetCharacterInfo(int _attack) {
		this.setAttack(_attack);
		System.out.println(String.format("캐릭터 : %s, 공격력 : %s", this.getName(), this.getAttack()));
	}
	
	public void GetCharacterInfo(String _name, int _attack) {
		this.setName(_name);
		this.setAttack(_attack);
		System.out.println(String.format("캐릭터 : %s, 공격력 : %s", this.getName(), this.getAttack()));
	}
	
	//-----
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAttack() {
		return attack;
	}
	public void setAttack(int attack) {
		this.attack = attack;
	}
}

class ExtCharInfo extends CharacterInfo {
	
	private String name = "일반병사";
	private int attack = 10;
	
	public ExtCharInfo() {}
	
	//----- OverLoad
	
	public void GetCharacterInfo() {
		System.out.println(String.format("특화 캐릭터 : %s, 공격력 : %s", this.getName(), this.getAttack()));
	}
	
	public void GetCharacterInfo(String _name) {
		this.setName(_name);
		System.out.println(String.format("특화 캐릭터 : %s, 공격력 : %s", this.getName(), this.getAttack()));
	}
	
	public void GetCharacterInfo(int _attack) {
		this.setAttack(_attack);
		System.out.println(String.format("특화 캐릭터 : %s, 공격력 : %s", this.getName(), this.getAttack()));
	}
	
	public void GetCharacterInfo(String _name, int _attack) {
		this.setName(_name);
		this.setAttack(_attack);
		System.out.println(String.format("특화 캐릭터 : %s, 공격력 : %s", this.getName(), this.getAttack()));
	}
	
	//-----
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAttack() {
		return attack;
	}
	public void setAttack(int attack) {
		this.attack = attack;
	}
}

ExtCharInfo 클래스는 CharacterInfo 클래스를 상속받는다.

자식클래스는 ExtCharInfo 이고 , 부모클래스는 CharacterInfo 이다.

다른 것이 전혀 없다.

메서드명도 중복되고, 인자값도 중복된다.

하지만 출력문의 구문만 조금 다를 뿐이다.

오버라이딩의 뜻을 다시 생각해보자.

중요한 것 때문에 기존의 것을 무시한다.

즉, 부모클래스에 있는 메서드를 완전히 다르게 사용하고자 할 때 자식클래스에서 메서드를 재정의한다.

그렇기에 부모클래스에 있던 메서드는 완전히 무시되고, 자식클래스에 있는 메서드가 우선시된다.

결과화면을 보자.

반응형

댓글