Overloading
같은 class 내에 같은 이름의 매서드를 만들고,
인자와 반환값을 달리하여 호출 할 때, 맞는 메서드를 선택해서 사용하게 하는 기법
Overriding
부모 클래스의 맴버 메서드를 자식 클래스에서 동일한 메서드 이름으로 내용을 달리하여 재지정하는 기법
Overloading 오버로딩
하나의 클래스 내에 동일한 이름의 메서드가 여러개 있을 때,
함수 호출은 인자 타입 (String, int, ...)이나 인자 개수(int a, int b인 경우 2개)등으로 스스로 구별되어 처리된다.
class Calc {
int add(int a, int b) {
return a+b;
}
int add(int a) { // 위아래 매서드, 전부 같은 이름.
return a+1;
}
double add(double a, double b) {
return a+b;
}
}
public class ex1 {
public static void main(String[] args) {
Calc c = new Calc();
System.out.println(c.add(2,5));
System.out.println(c.add(4));
System.out.println(c.add(2.0,5));
}
}
첫번째 프린트함수는 두개의 인자를 표현한, Calc class의 첫번째 add() 함수를 호출하고,
두번째 프린트함수는 한개의 인자를 표현한, Calc class의 두번째 add() 함수를 호출하고,
세번째 프린트함수는 실수를 포함한 인자를, Calc class의 세번째 add() 함수를 호출한다.
class Cat {
String name, place; // member_variable
int age;
void setData(String n, String p, int a) { // member_method
name = n;
place = p;
age = a;
}
void print() { // member_method
System.out.println("1. " +place + " : " + name + " " + age + "세");
}
void print(String p, int a) { // member_method overloading
place = p; // local variable : used in this function
System.out.println("2. " + place + " 고양이는 " + a + " 마리 입니다.");
}
void print(String variety) { // member_method overloading
System.out.println("3. " + place + " : " + name + " " + age + " 세 " + variety);
}
}
public class ex1 {
public static void main(String[] args) {
Cat c = new Cat();
Cat c1 = new Cat();
Cat c2 = new Cat();
c.setData("Nero","Mine",2);
c1.setData("Maty","Neighbor",14);
c.print("Mixed");
c1.print();
c2.print("Mine", 0);
}
}
객체 c, c1, c2를 생성하고
c와 c1은 세개의 인자를 입력하여 첫번째setData()에 세팅하고,
c 객체에 print()에 Mixed 매개변수를 입력하여 Cat class의 네번째 함수를 불러온다.
이미 인자가 저장되어 있는 c1을 매개변수 없이 print()를 불러 두번째 함수를 불러오는데, 세팅된 값을 가져온다.
c2객체를 불러 print()에 매개변수로 Mine과 0을 넣어 세번째 함수를 불러 사용한다.
Overriding
Method overriding
접근 제어자인 private가 설정된 클래스에는 해당 클래스의 맴버 변수와 메서드만 이용할 수 있는데,
슈퍼 클래스(부모 클래스)에서 정의된 메서드와 동일한 이름의 메서드를 상속을 통해
자식 클래스에서 추가적으로 선언하여 사용하는 경우를 말한다.
부모 클래스의 필드 값들을 자식 클래스에서 상속받은 뒤, 재지정하여 사용하는 경우.
상속 (inherit)은 부모 클래스의 필드에 있는 맴버(변수, 메서드)들을 자식 클래스에서 그대로 불러 사용할 수 있다.
부모 맴버들을 변경없이 그대로 사용하면 상속이고,
자신에 맞게 이름을 그대로 사용하면서 변형해서 사용하면 overriding이 된다.
클래스 상속은 extends를 사용한다.
class Greeting {
void bye() {
System.out.println("Good Bye");
}
}
class Insa extends Greeting {
}
class C extends Insa {
void bye() {
System.out.println("BYBYBBYBYBYBYBYe");
}
}
class D extends C{
}
public class ex2 {
public static void main(String[] args) {
Greeting g = new Greeting();
Insa i = new Insa();
Greeting c = new D();
g.bye();
i.bye();
c.bye();
}
}
Good Bye
Good Bye
BYBYBBYBYBYBYBYe
g.bye() 는 Greeting class 만 사용하는 객체를 만들어서 최상위 부모의 bye()를 불러온 것이고,
i.bye() 는 Insa class 객체로만 만들고, bye()는 없지만 부모 class의 bye()가 있기에 부모의 bye()를 불러서 사용
c.bye()는 Geeting class에서 D class 까지 연결된 중간 자식들 모두 사용하는데,
오버라이딩 된 최하위 자식인 C class의 bye()를 불러서 사용하였다.
class Animal {
int age;
String name;
void printPet() {
System.out.println("이름 : " + name + "\n나이 : " + age);
}
}
class Cat extends Animal{
String variety;
void printPet() {
super.printPet(); // super points to Parents method
System.out.println("종류 : " + variety);
// overriding
// System.out.println("이름 : " + name + "\n종류 : " + variety);
// 부모의 메서드와 자식의 메서드 결합
}
}
public class ex1 {
public static void main(String[] args) {
Cat c = new Cat(); // 자식 클래스의 객체 생성
c.name ="Nerro";
c.age = 5;
c.variety = "Persian";
c.printPet();
}
}
이름 : Nerro
나이 : 5
종류 : Persian
Animal class와 Cat class의 printPet() 함수에는 인자가 없기 때문에,
c.printPet("Nerro", 5 , "Persian")이렇게 사용할 수 없다.
그래서 name, age, variety 에 각각 값을 입력해주고 함수를 불러 사용한다.
JAVA inherit 상속, private, super 생성자 (0) | 2022.07.28 |
---|---|
JAVA 메서드 호출 방식(값 호출, 주소 호출) static, abs() 절대값 (0) | 2022.07.26 |
JAVA 가변 인수 (0) | 2022.07.26 |
JAVA 개념 ( class, instance, parameter, argument, 상속, 캡슐화, 다형성, 인터페이스, 추상 클래스 ) (0) | 2022.07.26 |
JAVA for, while, break, continue, label 를 이용한 예문 (0) | 2022.07.26 |