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 하기>
예제 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();
}
}
'일단 해보는 코딩 > Java' 카테고리의 다른 글
[Java] Object 객체 (0) | 2022.08.08 |
---|---|
[Java] 생성자(Construct) (0) | 2022.08.07 |
[Java] 인스턴스 변수와 클래스 변수 (0) | 2022.08.07 |
[Java] 클래스 생성(도트연산자), 인수의 반환/값 (0) | 2022.08.07 |
[Java] 객체지향언어 (클래스에 대하여) (0) | 2022.08.06 |