일단 해보는 코딩/Java

[Java] 오버로딩(Overloading), 상속과 오버라이딩(Overriding)

eun_zoey2 2022. 8. 8. 15:44
728x90
Overload

 

      오버 로딩(Overloading)은 매개변수의 개수와 타입은 다르지만 이름이 같은 메서드를 여러 개 정의하는 것

        - 오버로딩 : 메서드 중복 정의

        - 일반적으로 메서드 사용 시, 메서드명을 구분해서 사용

        - but, 같은 기능을 갖고 있는 메서드라면, 매번 이름 정의하는 것이 불필요

 

 

    <class 이용해서 Overloading 하기>

더보기

 예제 1)

package Java07;

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 Test02 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Calc cal = new Calc();
		//cal.add(5,7);
		//cal.add(4);
		//cal.add(10.3, 11.0);
		System.out.println(cal.add(5,7));
		System.out.println(cal.add(4));
		System.out.println(cal.add(10.3,11.0));
		
	}
}

 

예제 2)

 

package Java07;
class Cat {
	String name,place;
	int age;
	void setDate(String n, String p, int a ) {	//member_method1
		name = n;
		place = p;
		age = a;
	}
	void print() {
		System.out.println(place + ":" + name + " " + age + "살");	//member_method2
	}
	void print(String p, int a) {	//member_method3, method2 overloading
		place = p; // local variable : used in this function
		System.out.println(place + "고양이는" + a + "마리입니다.");
	}
		void print(String variety) {	//member_method4, method2,3 overloading
			System.out.println(place + ":" + name + " " + age + "살" + variety);
	}
}

public class Test03 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Cat cat1 = new Cat();	//making each object from one base Class :하나의 클래스로부터 각각의 객체를 만듦.
		Cat cat2 = new Cat();
		Cat cat3 = new Cat();
		cat1.setDate("Nero", "Mine", 10);
		cat2.setDate("Marry", "Neighbor", 14);
		cat1.print("Mixed");
		cat2.print();
		cat3.print("Mine", 0);	// method overloading-calling based into arguments
	}

}

 

예제 3) 

package Java09;

class ExtendsEx2 {
	String str;
	int num;
	char ch;
	void setValue(String n, int a, char c) {
		this.str = n;
		this.num = a;
		this.ch = c;
	}
	void print(String str) {
		System.out.println(str);
	}
	void print(int num) {
		System.out.println(num);
	}
	void print(char ch) {
		System.out.println(ch);
	}
}

	public class Test01_02 {
		
	public static void main(String[] args) {
		ExtendsEx2 ee = new ExtendsEx2();
		ee.print("test");
		ee.print(100);
		ee.print('F');

	}
}

    <기본 예제>

더보기

Q1.  매개변수의 타입, 매개변수의 갯수에 따른 변화 오버로딩

 

package Home18;

public class SumEx {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		sum(10,20);
		sum(1.23,1.23);
		sum(10,20,30);
	}
	// 메세지의 매개변수 타입에 변화
	static void sum(int x, int y) {
		System.out.println(x+y);
	}
	static void sum(double x, double y) {
		System.out.println(x+y);
	}
	static void sum(int x, int y, int z) {
		System.out.println(x+y+z);
	}
	// 메서드의 매개변수 갯수의 변화 
}

Q2. 두 수를 전달받아 사칙연산 구현하기 (단 정수, 실수 모두 가능)

package Home18;

public class Calc2 {

	public static void main(String[] args) {
		System.out.println("--정수의 사칙연산--");
		System.out.println("sum(10,20) : " + sum(10,20));
		System.out.println("sub(10,20) : " + sub(10,20));
		System.out.println("mul(10,20) : " + mul(10,20));
		System.out.println("div(10,20) : " + div(10,20));
		
		System.out.println("--실수의 사칙연산--");
		System.out.println("sum(1.2,2.3) : " + sum(1.2,2.3));
		System.out.println("sub(1.2,2.3) : " + sub(1.2,2.3));
		// 유한한 개수의 비트를 가지고 무한한 실수를 표현해야 하므로 -1.1이 나오는 것이 아니라 가장 근접한값으로 나온다!
		System.out.println("mul(1.2,2.3) : " + mul(1.2,2.3));
		System.out.println("div(1.2,2.3) : " + div(1.2,2.3));
		
		System.out.println("--문자열의 사칙연산--");
		System.out.println("sum(Hello,Java) : " + sum("Hello","Java"));
				
		
	}
// 정수형의 사칙연산
	static int sum(int x, int y) {return x+y;}
	static int sub(int x, int y) {return x-y;}
	static int mul(int x, int y) {return x*y;}
	static int div(int x, int y) {return x/y;}
// 실수형의 사칙연산	
	static double sum(double x, double y) {return x+y;}
	static double sub(double x, double y) {return x-y;}
	static double mul(double x, double y) {return x*y;}
	static double div(double x, double y) {return x/y;}
//문자열의 덧셈연산
	static String sum(String x, String y) {return x+y;}
}

    알아두기

더보기

컴퓨터가 함수를 구분하는 시그니처

    1. 함수명

    2. 함수의 매개변수의 개수

    3. 함수의 매개변수의 타입

 

상속이란?

   

      상속(inherit)은 부모가 보유하고 있는 재산(필드 : 멤버 메써드와 멤버 변수) 중 일부/전부를 자식이 물려받는 것.

클래스 상속은 객체의 재사용이라는 장점뿐 아니라, 코드의 간결성을 제공해주는 객체지향언어의 최고 장점이라 할 수 있다.

그러므로 잘 정의된 부모 클래스가 있다면 자식 클래스의 작성이 간편해진다는 장점이 있다.

 

상속방법 - class 클래스_명 extends 부모클래스_명 {    }

 

      상속 시 주의할 점 !!

        - 다중 상속 지원 안됨

        - 클래스 앞 final 키드는 다른 클래스가 상속 불가

        -부모 클래스에서 private로 선언된 멤버는 자식 클래스에서 사용할 수 없다. 

 

      <상속 예제 >

더보기

Q1. 사람 클래스를 생성하고, 사람의 기능을 상속받는 학생 클래스와 선생 클래스 생성하기

Q1. 사람 클래스를 생성하고, 사람의 기능을 상속받는 학생 클래스와 선생 클래스 생성하기

package Home23;

public class Inheritance1 {
	public static void main(String[] args) {
		Student st = new Student();
		st.breath();
		st.learn();
		
		Teacher t = new Teacher();
		t.eat();
		t.teach();
		
	}
}
class Person{
	void breath() {
		System.out.println("숨쉬기");
	}
	void eat() {
		System.out.println("먹기");
	}
	void say() {
		System.out.println("말하기");
	}
}
class Student extends Person {
	void learn() {
		System.out.println("배우기");
	}
}
class Teacher extends Person{
	void teach() {
		System.out.println("가르치기");
	}
}

 

Overriding

 

      오버 라이딩(Overriding)은 자식클래스에서 부모클래스로부터 받아온 메서드를 재정의 하는것

        - 자식에 맞는 기능으로 맞춰 동작하기 위해 사용한다.

 

      부모 클래스의 필드 사용 방법 ? super

        - 부모 클래스의 생성자 호출

        - 무조건 자식 클래스의 생성자 첫 줄에서 이뤄짐

        - 작성하지 않을 시, 컴파일러가 자동 호출

 

      자식 클래스 내 필드 사용 방법? this

        - 부모 클래스의 생성자 호출

        - 무조건 자식 클래스의 생성자 첫 줄에서 이뤄짐

        - 작성하지 않을 시, 컴파일러가 자동 호출

 

      <super, this 사용예제>

더보기
package Home23;

public class SuperConstructor {
	public static void main(String[] args) {
		SportsCar mycar = new SportsCar("red",300);
		System.out.println(mycar.color);
		System.out.println(mycar.speedLimit);
	}

}
class Car{
	int wheel;
	int speed;
	String color;
	Car(){} //오류해결 방법 1
	Car(String color){
		this.color=color;
	}
}

class SportsCar extends Car{
	int speedLimit;
	SportsCar(String color, int speedLimit){
		/* 오류 발생 이유?
		자식클래스에서 생성자 호출 시, 부모클래스의 디폴트 생성자가 자동으로 호출되기 때문에 부모의 디폴트 생성자가 존재해야한다.*/
		super(color); //오류해결 방법 2
		this.color=color;
		this.speedLimit=speedLimit;
	}
}

      <class 이용해서 Overriding 하기>

더보기
Q1) 리더클래스를 생성하고 이전에 생성했던 학생 클래스를 상속받아, say(  ) 메서드를 다음과 같이 재정의 하기

 

 

예제 1)

package Java07;
class Animal {	// 부모 클래스에서 이름만 지정하고 아무 멤버들을 지정하지 않으면 '가상 클래스'가 된다. 
	int age; 
	String name;
	void printPet() {
		System.out.println("이름 : " + name);
		System.out.println("나이 : " + age);
	}
}
	class Cats extends Animal { 	// Cat class is inherited by Animal class
		String variety;
		void printPet() {	//parents method use
			super.printPet(); //super points to parents method
			System.out.println("종류 : " + variety);
			//부모의 메써드를 불러서 이용하면서 자신만의 메써드로 변경해서 사용 (overriding)
			System.out.println("이름 : " + name + "종류 : " + variety);
			// 부모 메써드와 자식의 메써드 결합
		}
	}
public class Pet {
	
	public static void main(String[] args) {
		Cats cat = new Cats();
		cat.name = "Nerro";
		cat.age = 5;
		cat.variety = "Persian";
		cat.printPet();
		
	}
  }