일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- CNN
- 블록체인
- AP Computer Science A
- bioinformatics
- Java
- MERS
- 바이오인포매틱스
- 이항분포
- 자바
- 생물정보학
- SVM
- COVID
- 행렬
- AP
- 결정트리
- Kaggle
- 딥러닝
- ncbi
- 캐글
- 바이오파이썬
- 인공신경망
- 인공지능 수학
- 시그모이드
- 생명정보학
- 오류역전파
- 인공지능
- BLaST
- 알파폴드
- 파이썬
- 서열정렬
- Today
- Total
데이터 과학
오버로딩과 오버라이딩 예제 본문
- 오버로딩
오버로딩(overloading)은 이름이 같으면서 매개변수(parameter)가 다른 경우를 나타냅니다.
이름에 대한 중복성이 있으면서 매개변수가 다르기 때문에 바인딩에 대한 효과가 있습니다.
일반적인 컴퓨터 언어에서 오버로딩 기법을 많이 사용하고 있습니다.
다음 예제를 보면서 이해해 봅시다.
예제1)
public class Main
{
public void Overloading() {
System.out.println("기본 오버로딩 결과");
}
public void Overloading(int a) {
System.out.println("정수형 오버로딩 결과");
}
public void Overloading(double b) {
System.out.println("실수형 오버로딩 결과");
}
public static void main(String[] args) {
Main a = new Main();
a.Overloading();
a.Overloading(1);
a.Overloading(1.4);
}
}
결과:
기본 오버로딩 결과
정수형 오버로딩 결과
실수형 오버로딩 결과
위 예제는 Main이름의 클래스 입니다.
a.Overloading(); 으로 선언된 부분은 Overloading() 메소드를 호출하고. a.Overloading(1); 으로 선언된 부분은 Overloading(int a) 메소드를 호출합니다. 그리고, a.Overloading(1.4); 으로 선언된 부분은 Overloading(double b) 메소드를 호출하는데 각각 매개변수의 데이터 타입에 따라 자동으로 호출되고 있습니다.
오버로딩은 매개변수의 타입에 따라 자동으로 연결되는 문법입니다.
- 오버라이딩
오버라이딩(Overriding)은 오버로딩과는 다른 상황입니다. 상속(Inhritance)에서만 사용하는 것이 오버라이딩이며 재정의의 의미가 있습니다. 부모 클래스의 메소드를 자식 클래스에서 재정의를 설정하는 것입니다.
다음 예제를 한번 봅시다.
예제2)
class Main0
{
public void Overriding() {
System.out.println("기본 오버라이딩 결과");
}
}
public class Main extends Main0 {
public void Overriding() {
System.out.println("상속 오버라이딩 결과");
}
public static void main(String[] args) {
Main0 a = new Main();
a.Overriding();
}
}
결과:
상속 오버라이딩 결과
위 예제에서 메인 메소드 안에 있는 Main0 a = new Main(); 명령어에서 a는 객체인 Main()의 이름입니다. a는 자식 클래스인 Main안에 있는 메소드를 정의하는데 여기서 a.Overriding(); 은 Main0이 아닌 Main 클래스안에 있는 Overring() 메소드를 정의합니다.
그렇기 때문에 이에 대한 결과는 Main 클래스내에 있는 Overriding() 의 결과가 화면에 나옵니다.
이를 추상화로 간략히 만들면 다음과 같습니다.
예제3)
abstract class Main0
{
public abstract void Overriding();
}
public class Main extends Main0 {
public void Overriding() {
System.out.println("상속 오버라이딩 결과");
}
public static void main(String[] args) {
Main0 a = new Main();
a.Overriding();
}
}
결과:
상속 오버라이딩 결과
추상 클래스로 만들면 더 간단한 코드가 나옵니다.
지금까지 오버로딩과 오버라이딩을 하나의 예제로 나타내면 다음과 같습니다.
예제4)
abstract class Main0
{
private int a;
private double c;
public abstract void Overriding();
public void Overloading() {
System.out.println("기본 오버로딩 결과");
}
public int Overloading(int a) {
this.a=a;
return a;
}
public double Overloading(double b) {
c=b;
return c;
}
}
class Main1 extends Main0 {
private int c;
public void Overriding() {
System.out.println("상속 오버라이딩 결과");
}
public int Overloading(int a,int b) {
c=a*b;
return c;
}
}
public class Main {
public static void main(String[] args) {
Main0 k = new Main1();
k.Overriding();
k.Overloading();
int l=k.Overloading(5);
double m=k.Overloading(3.5);
int p=k.Overloading(3,3);
System.out.println("오버라이딩 결과"+l+""+m+""+p);
}
}
이 예제를 실행하면 컴파일 에러가 나옵니다. 왜 그럴까요?
아마 int p=k.Overloading(3,3); 이 에러라고 나올텐데요. 원인은 Main0 k = new Main1();에 있습니다.
Main0 k = new Main1(); 에서는 k라는 객체가 생성되었는데 이 생성된 객체에서 데이터 타입이 Main0 입니다.
Main0이 가지고 있는 메소드들을 잘 보면
abstract void Overriding();
public void Overloading()
Overloading(int a)
Overloading(double b)
이렇게 4개의 메소드만 가지고 있습니다. 중요한 것은 Overloading(int a,int b)이라는 메소드는 없습니다. 데이터 타입에서 이 메소드를 호출할 수 없는 것이죠.
이러면 Main0 k = new Main1(); 에서 데이터 타입은 Main0를 Main1으로 변경해야 합니다.
예제5)
abstract class Main0
{
private int a;
private double c;
public abstract void Overriding();
public void Overloading() {
System.out.println("기본 오버로딩 결과");
}
public int Overloading(int a) {
this.a=a;
return a;
}
public double Overloading(double b) {
c=b;
return c;
}
}
class Main1 extends Main0 {
private int c;
public void Overriding() {
System.out.println("상속 오버라이딩 결과");
}
public int Overloading(int a,int b) {
c=a*b;
return c;
}
}
public class Main {
public static void main(String[] args) {
Main1 k = new Main1();
k.Overriding();
k.Overloading();
int l=k.Overloading(5);
double m=k.Overloading(3.5);
int p=k.Overloading(3,3);
System.out.println("오버라이딩 결과"+l+""+m+""+p);
}
}
결과
상속 오버라이딩 결과
기본 오버로딩 결과
오버라이딩 결과53.59
데이터 타입을 조정하면 아무 문제 없이 결과나 나타납니다.
중간에 문자열을 하나 더 입력했습니다. 결과를 보면서 오버로딩과 오버라이딩을 잘 섞어서 사용할 수 있도록 이해해야겠습니다.
예제6)
abstract class Main0
{
private int a;
private double c;
public abstract void Overriding();
public void Overloading() {
System.out.println("기본 오버로딩 결과");
}
public int Overloading(int a) {
this.a=a;
return a;
}
public double Overloading(double b) {
c=b;
return c;
}
}
class Main1 extends Main0 {
private int a;
public void Overriding() {
System.out.println("상속 오버라이딩 결과");
}
public void Overloading(String str) {
System.out.println(str);
}
}
public class Main {
public static void main(String[] args) {
Main1 k = new Main1();
k.Overriding();
k.Overloading();
int l=k.Overloading(5);
double m=k.Overloading(3.5);
k.Overloading("오버로딩 예제");
System.out.println("오버라이딩 결과"+l+""+m);
}
}
결과
상속 오버라이딩 결과
기본 오버로딩 결과
오버로딩 예제
오버라이딩 결과53.5
아래 예제는 위 예제4에서의 문제점을 해결한 다른 방법입니다.
간단하게 다운캐스팅을 사용했습니다.
예제 7)
abstract class Main0
{
private int a;
private double c;
public abstract void Overriding();
public void Overloading() {
System.out.println("기본 오버로딩 결과");
}
public int Overloading(int a) {
this.a=a;
return a;
}
public double Overloading(double b) {
c=b;
return c;
}
}
class Main1 extends Main0 {
private int c;
public void Overriding() {
System.out.println("상속 오버라이딩 결과");
}
public int Overloading(int a,int b) {
c=a*b;
return c;
}
}
public class Main {
public static void main(String[] args) {
Main0 k = new Main1(); // upcasting
k.Overriding();
k.Overloading();
int l=k.Overloading(5);
double m=k.Overloading(3.5);
Main1 n=(Main1)k; //downcasting
int p=n.Overloading(3,3);
System.out.println("오버라이딩 결과"+l+""+m+""+p);
}
}
결과
상속 오버라이딩 결과
기본 오버로딩 결과
오버라이딩 결과53.59
'프로그래밍 언어론 > JAVA 기초' 카테고리의 다른 글
제네릭 (0) | 2023.06.06 |
---|---|
자바언어에서 ArrayList (0) | 2023.06.06 |
this 키워드 (1) | 2023.05.16 |
객체지향 (21) | 2023.04.15 |
public, private, 그리고 static (0) | 2023.03.27 |