Overload/ Overriding 에 대해 알아보자
Oevrload :
하나의 클래스 내에 동일한 이름의 메써드가 여러 개 있을 때 함수 호출 시
어떤 메써드를 선택하는 여부는 메써드의 인자 타입(String, int, ......)이나
인자의 개수 (int a, int b 인경우는 2개) 등으로 스스로 구별되어 호출되어서 처리된다.
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();
System.out.println(cal.add(5, 7));
System.out.println(cal.add(10.3, 11.0));
System.out.println(cal.add(4));
}
}

package java07;
class Cat{
String name, place; //member_variable
int age;
void setData(String n, String p, int a) {
name = n;
place = p;
age = a;
}
void print() { //member_method2
System.out.println(place+ " : "+name+" : "+age+" 살");
}
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_method, 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.setData("Nero", "Mine", 10);
cat2.setData("Mary", "Neighbor", 14);
cat1.print("Mixed");
cat2.print();
cat3.print("Mine",0); // method overloading-calling based onto arguments
}
}

Overriding:
접근 제한자인 private가 설정된 클래스에는 해당 클래스의 멤버 변수와 메써드만 이용할 수 있는데 슈퍼클래스(부모클래스)에서 정의된 메써드와 동일한 이름의 메써드를 상속을 통해서 자식 클래스에서 추가적으로 선언해서 사용하는 경우를 말한다. 부모 클래스의 필드 값들을 자식 클래스에서 상속받은 뒤 재지정해서 사용하는 경우
상속(inherit) :
부모 클래스의 필드에 밌는 멤버(변수, 메써드)들을 자식 클래스에서 그대로 불러다가 사용하는 경우, 부모 멤버들을 변경없이 그대로 사용하면 상속이고, 자신에 맞게 이름을 그대로 사용하면서 변형해서 사용하면 overriding이 된다. 클래스 상속은 extends를 사용한다.
class Greeting{
void bye(){
System.out.println("Good bye");
}
}
Greeting greet = new Greeting();
greet.bye();
............
class Insa extends Greeting {//부모 클래스 Greeting의 자식 클래스 Insa선언
void bye();
// 부모 클래스의 멤버 메써드 bye()를 그대로 불러다 사용, 자식 클래스에서는 별도로 bye()메써드가 할 일을 지정하지 않아도 됨
System.out.println("Bye, bye"); //이 부분이 overriding
}
}
Insa insa = new Insa(); //자식 클래스에서도 자신만의 객체 생성
insa.bye();
package java07;
class Animal{
// 부모 클래스에서 이름만 지정하고 아무 멤버들을 지정하지 않으면 '가상 클래스'가 된다.
int age;
String name; //this.name = 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) {
// TODO Auto-generated method stub
Cats cat = new Cats(); //자식 클래스의 객체 cat 생성
cat.name = "Nerro"; //부모 클래스의 name변수을 불러다 사용
cat.age = 5;
cat.variety = "Persian"; //자식클래스의 variety 변수를 불러서 사용
cat.printPet();
}
}

메써드 호출방식
메써드 호출은 함수 호출과 같이 메써드_명()를 사용하면 메써드의 내용이 실행된다.
여기에는 call by value(갑에 의한 호출)이라는 '깊은 복사' 방식은 값을 복사해서 사용하는 방식이고,
call by reference(참조에 의한 호출)는 '얇은 복사'방식은 메모리 주소를 참조해서 거기에 들어 있는 값을 꺼내서 사용하는 방식이다. 변수는 계속 변하기 때문에 call by reference 방식이 더 좋다.
메써드 매개변수(parameter, argument)
매써드 매개변수 메써드를 호출하면서 값을 전달할때 사용되는 값으로
void print(int a){
System.out.println(a);
}
print(10); 형태에서 print() 메써드를 호출하면서 10 을 건네주면 이 10 이 print()함수의 int a값으로 복사되어 들어간 다음 , 이 메써드가 하는 print()작업을 수행한다.
package java07;
import java.util.Iterator;
public class Test04 {
void hello() {
System.out.println("안뇽???");
}
static void hell() { // static은 정적이라는 의미로 고정되어 있다는 의미
System.out.println("Hello???");
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Test04 ex = new Test04(); // 클래스에서 객체 생성후 사용
ex.hello();
hell();
/*static이 붙은 클래스에서는 객체를 생성하지 않아도 hell()식으로 메써드를 호출할 수 있다.
static이 붙으면 프로그램 실행 시 자동으로 메모리에 올라가서 실행되기 때문이다.*/
for(int i = 1; i<=10; i++) {
ex.hello();
hell();
}
}
}

package java07;
public class Test04 {
static void hello(String name) {
System.out.println(name+"님, 안뇽???");
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Test04 ex = new Test04(); // 클래스에서 객체 생성후 사용
hello("Paul"); // 위에서 static으로 멤버 메써드를 선언했기 때문에 객체 생성 없이 바로 호출
hello("Mary");
for(int i = 1; i<=10; i++) {
hello("Kim"+ i);
}
}
}

Q) 객체를 이용해서 단을 입력받아 구구단을 작성하시오.
package java07;
import java.util.Scanner;
public class Test05Q {
static void gugu(int dan) {
for (int i=1; i<=9; i++) {
System.out.println(dan+ "x"+i+"="+dan*i);
}
}
public static void main(String[] args) { //모든 프로그램은 main()에서 시작해서 main()에서 끝남
// TODO Auto-generated method stub
System.out.println("단을 입력하세요=>1~9사이");
Scanner scan = new Scanner(System.in);
int a = scan.nextInt();
gugu(a); //위에서 static으로 멤버 메써드를 구현했기 때문에 객체를 생성하지 않음
}
}

-반환값
반환값은 return으로 표시하는데 현재 실행중인 메써드는 실행한 뒤 메써드를 호출한 곳으로 프로세스가 되돌아 가다, 이때 함수 실행으로 리턴값이 없으면 return을 생략할 수 있고, return값이 있으면 뒤에 값을 지정하는데 리턴값은 하나만 있을 수 있다. 메써드에서 선언된 리턴 타입과 return되는 자료형은 반드시 같아야한다.
==> 보통은 함수를 처리할 때 변수와 함수 선언을 main()메써드 앞에서 먼저하고 함수 몸체도 먼저 기술해 주는 것이 좋다. 하지만 함수 몸체는 main()메써드 다음으로 넘겨도 된다.
package java07;
import java.util.function.BiConsumer;
class Return{
static int sum(int a) {
int result = 0;
for (int i=1; i<=a; i++) {
result += i;
}
return result; // 이 result: sum()메써드를 호출한 곳으로 반환값을 전해줌
}
}
public class Test06 {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("시작~");
int n = Return.sum(10);
// 인자로 10을 주면서 Return 클래스의 sum()함수 호출해서 실행 한뒤 결과를 n에 저장
System.out.println("합계 : "+n);
System.out.println("~끝");
}
}

package java07;
class Returnd{
static int sum(int a, int b) {
return a+b;
}
}
public class Test07 {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(Returnd.sum(10, 20));
}
}

package java07;
import javax.accessibility.AccessibleContext;
class A{
void a (int x) { // 어느 명칭()는 메써드이다.
System.out.println("인수는 "+ x);
}
}
public class Test08 {
public static void main(String[] args) {
// TODO Auto-generated method stub
A x = new A();
x.a(5);
// this.a(10); or super.a(10); 는 모두 불가
}
}

package java07;
class Calcc{
int opera(int a, int b) {
return a*b;
}
}
public class Test09 {
static void disp() {
// int o;
Calcc cal = new Calcc(); // Not of static method, make object here
int o = cal.opera(9, 10); // method calling with argument 9 and 10
System.out.println(o);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
disp(); //함수 호출은 main()에서 수행!!!
}
}

package java07;
import java.util.*;
public class Test10 {
private static int abs(int num) {
return num >=0 ? num :-num ; // 3항 연산자
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int a = -1;
System.out.println("a의 값 :"+a);
System.out.println("a의 절대값 : "+abs(a));//내장된 함수abs()
System.out.println("a의 절대값 : "+Math.abs(a));
}
}

package java07;
public class Test11 { // <= Call by Reference
static void test1(int []n) {
System.out.println(n); // 배열의 시작 주소를 보임
for (int i=0; i<n.length; i++) {
System.out.println(n[i]);
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int [] num = {10, 20, 30, 40, 50};
System.out.println(num);
test1(num);
}
// test1(num[0], num[1], num[2], num[3], num[4])); 하면 Call by value, needless of for - sentence
}

'JAVA' 카테고리의 다른 글
| [JAVA]Object, 제네릭 클래스, 추상 메써드 (0) | 2022.07.28 |
|---|---|
| [JAVA] 상속 (0) | 2022.07.27 |
| [JAVA] 가변 인수 (0) | 2022.07.26 |
| [JAVA]클래스/ 메써드 (0) | 2022.07.26 |
| [JAVA] do while 문 (0) | 2022.07.26 |
댓글