메소드 오버로딩(method overloading)


1. 동일한 명칭을 가진 메소드가 두개 이상인 경우를 메소드 오버로딩 상태라고 함. 같은 클래스에 있는 두개 이상의 같은 메소드명의 메소드를 말함.

2. 메소드가 중복 정의된 상태를 말함.

3. 오버로딩된 상태가 되려면 메소드 이름은 같지만 매개변수 리스트가 달라야 한다. 자료형, 갯수, 순서등이 틀린 경우만 허용.


//Class39.java






문제) 덧셈 결과를 출력하는 메소드 만들기. 오버로딩 메소드로 구현.


1. 1부터 10까지의 합을 출력 

-> public int add()

2. 1부터 n까지의 합을 출력 

-> public int add(int n)

3. n부터 m까지의 합을 출력 

-> public int add(int n, int m)

4. n부터 m까지의 합을 출력하되, x의 배수만 계산 

-> public int add(int n, int m, int x)

5. 임의의 수를 여러개 입력 받아서 합을 출력 

-> public int add(int[] arr)


실행 예)

덧셈 결과를 출력하는 메소드 만들기

1. 1부터 10까지의 합을 출력 

2. 1부터 n까지의 합을 출력 

3. n부터 m까지의 합을 출력 

4. n부터 m까지의 합을 출력하되, x의 배수만 계산 

5. 임의의 수를 여러개 입력 받아서 합을 출력 

6. 종료

선택(1~5, 6:종료)?1


1부터 10까지 합 : xxxx


덧셈 결과를 출력하는 메소드 만들기

1. 1부터 10까지의 합을 출력 

2. 1부터 n까지의 합을 출력 

3. n부터 m까지의 합을 출력 

4. n부터 m까지의 합을 출력하되, x의 배수만 계산 

5. 임의의 수를 여러개 입력 받아서 합을 출력 

6. 종료

선택(1~5, 6:종료)?2


숫자 입력(n)? 100

1부터 100까지 합 : xxxx



//Calc.java

//Process.java

//Class40.java -> main() 포함








상속(inheritance)


1. 객체 지향 프로그램에서 가장 중요한 개념.

2. 객체 지향 프로그램의 특성

- 상속, 다양성, 은닉성, 캡슐화


3. 클래스와 클래스 사이에 부모, 자식 관계가 맺어진 상태를 상속이라고 한다. 상속 관계인 클래스들은 파생 할 수 있는 상태가 된다.

원본A 클래스(기능3가지) -> (상속) -> 파생 B 클래스(기능3가지+기능 추가)

 수퍼(부모) 클래스                   서브(자식) 클래스


파생B 클래스는 원본 A 클래스의 기능을 재구현하기 위해서 해야 할 일이 없는 상태다. -> 상속 받겠다는 구문만 추가하면 됨.

서브 클래스가 수퍼 클래스를 선택해서 상속 표현하면 수퍼 클래스의 기능을 모두 내것으로 만들 수 있다.

상속 관계가 계속 이루어지는 경우 모든 수퍼 클래스의 모든 기능은 서브 클래스가 가지게 된다.


A 클래스(3가지) -> 상속 -> B 클래스(3가지 + 2가지) -> 상속 -> C 클래스(5가지+1가지)


4. 상속 관계에서 최상위 클래스는 Object 클래스이다. Object 클래스만은 상속 표기를 하지 않아도 자동 상속된다.

5. 상속 표기

public class 서브클래스명 extends 수퍼클래스명 {

//수퍼클래스의 멤버는 자동으로 서브클래스것이 된다.

//추가 멤버 구성

}




//Class41.java







수퍼클래스, 서브클래스 구현하기


//Super.java -> 메소드 한개만 구현

package com.test;


//Object 클래스 자동 상속

public class Super {

public void method1() {

}

}


//Sub.java -> 메소드 한개만 구현

package com.test;


//super 클래스를 상속받고 있다.

public class Sub extends Super {

//Super 클래스의 멤버도 Sub 클래스의 멤버가 된다.

//sub 클래스만의 고유 멤버 추가

public void method2() {

}

}



//Class42.java -> main() 

//Sub 클래스의 멤버확인 -> 2개

package com.test;


public class Class42 {


public static void main(String[] args) {

//Sub 클래스의 객체 생성 과정

Sub obj = new Sub();

//멤버구성 확인

obj.method1(); //-> Super의 고유멤버

obj.method2(); //-> Sub의 고유멤버

}

}



6. 상속은 수퍼 클래스를 한개만 선택할 수 있다.

7. 수퍼클래스의 멤버중에서 private 멤버는 상속 받을 수 없다.

8. final 키워드가 있는 클래스는 상속 받을 수 없다.







문제) 프린터라는 원본 클래스를 가지고 파생을 시켜본다.







상속 제한1 - 수퍼클래스를 한개만 선택할 수 있다.



//Class43.java







상속 제한2 - 수퍼 클래스의 멤버중에서 private 멤버는 상속받을 수 없다.


//Super3.java

//Sub3.java

//Class44.java







상속제한3 - final 키워드가 있는 클래스는 상속 받을 수 없다.


//Class46.java








메소드 오버라이딩(method overriding)


1. 동일한 명칭을 가진 메소드가 두개 이상인 경우를 메소드 오버라이딩 상태라고 함. 단, 서로 다른 클래스에서 같은 메소드가 존재하는 경우이고, 서로 다른 클래스는 상속 관계일 때만 성립.

2. 메소드가 재정의된 상태를 말함.


class Super {

public void method() {

//기능1

}

}


class Sub extends Super {

@Override

public void method() { //메소드 오버라이딩

//기능2 -> 기능1을 재정의한 상태

}

}


class Sub2 extends Sub {

@Override

public void method() { //메소드 오버라이딩

//기능3 -> 기능2을 재정의한 상태

}

}



//Class47.java







Member 클래스의 toString() 메소드 오버라이딩 테스트


//Member.java -> 이름, 전화번호 저장용 클래스

//Class48.java









문제) 덧셈 결과를 출력하는 메소드 만들기. toString()메소드를 오버라이딩하여 구현.


1. 1부터 10까지의 합을 출력 

2. 1부터 n까지의 합을 출력 

3. n부터 m까지의 합을 출력 

4. n부터 m까지의 합을 출력하되, x의 배수만 계산 



실행 예)

덧셈 결과를 출력하는 메소드 만들기

1. 1부터 10까지의 합을 출력 

2. 1부터 n까지의 합을 출력 

3. n부터 m까지의 합을 출력 

4. n부터 m까지의 합을 출력하되, x의 배수만 계산 

선택(1~5, -1:종료)?1


1부터 10까지 합 : xxxx



//Calc2.java

//Class49.java


WRITTEN BY
빨강꼬마

,
10일차의 가장 중요한 포인트

- 사용자 정의 클래스 자료형 만들기 및 클래스 자료형 선언 방법
- 선언한 클래스 자료형을 이용하여 여러 객체 생성
- 클래스 자료형으로 배열 만드는 이유
- 유저가 자료를 임의로 입력할때 setter 를 이용하여 클래스 자료형 배열에 객체를 저장.
- 클래스 자료형 배열 내에 getter를 이용하여 객체n번째에 저장된 자료를 출력


클래스, 객체, 인스턴스

1. 클래스의 객체에 원본 정의서.

2. 객체(instance)는 클래스가 실행되서 메모리에 적재된 상태를 말함.
클래스(원본) -> 객체1 -> 독립적인 상태 유지 -> 소멸 -> 가비지 컬렉터
                  -> 객체2 -> 독립적인 상태 유지 -> 소멸 -> 가비지 컬렉터
                  -> 객체3 -> 독립적인 상태 유지 -> 소멸 -> 가비지 컬렉터

클래스명 변수명 = new 클래스명();



문제) 거스름돈을 화폐단위로 구분해서 출력.
실행예)
금액(10~1000)? 990
총액 : 990원
오백원 1개, 백원 4개, 오십원 1개, 십원 4개




문제) 2자리 이상의 수를 입력 받아서 자릿수들의 합을 계산해서 출력. 클래스 이용.
실행 예)
숫자 입력(2자리 이상)?1234
1000자리의 수 -> 1
100자리의 수 -> 2
10자리의 수 -> 3
1자리의 수 -> 4
자릿수의 합 : 10

1234 -> 문자열 길이를 얻는다 -> 4

2 -> (10)2-1승 -> 10
3 -> (10)3-1승 -> 100
4 -> (10)4-1승 -> 1000
...
n -> (10)n-1승 -> 100000....  -> a

1234 -> (1234%10000)/1000 -> 1234/1000   -> 1
1234 -> (1234%1000)/100 -> 2
1234 -> ((1234%1000)%100)/10 -> 3
1234 -> (((1234%1000)%100)%10)/1 -> 4






문제) 2자리 이상의 수를 입력 받아서 자릿수들의 합을 계산해서 출력. 클래스 이용.
문자열을 한 글자씩 분리하는 방법으로 해결 
실행 예)
숫자 입력(2자리 이상)?1234
1000자리의 수 -> 1
100자리의 수 -> 2
10자리의 수 -> 3
1자리의 수 -> 4
자릿수의 합 : 10






문제) 세 개의 숫자 중에서 가장 큰 숫자 구하기. 사용자 정의 클래스 이용. sort() 메소드 금지
실행 예)
숫자1? X
숫자2? Y
숫자3? Z
입력 받은 숫자: X, Y, Z가장 큰 숫자: X






문제) 여러 개의 숫자 중에서 가장 큰 숫자 구하기. 배열 및 사용자 정의 클래스 이용. sort() 메소드 금지
실행 예)
입력할 숫자의 갯수 지정(2~10)?
숫자1? X
숫자2? Y
숫자3? Z
...
입력 받은 숫자: X, Y, Z, .....
가장 큰 숫자: X





접근 지정자


1. public, private, protected, default(표시하지 않는 상태)

2. 외부에서 해당 멤버를 접근할 수 있는 기준제시.

package 패키지명;
접근지정자 class 클래스명 {

접근지정자 자료형 멤버변수;
접근지정자 자료형 메소드명(매개변수 리스트) {
자료형 지역변수; //접근지정자 사용 불가.
//실행문
}

자료형 멤버변수;
접근지정자 자료형 메소드명(매개변수 리스트) {
자료형 지역변수; //접근지정자 사용 불가.
//실행문
}
}


3. 멤버변수는 private, 클래스나 메소드는 public을 주로 사용.

4.
public 지정시 -> 어떤 위치에서든지 접근 가능.
private 지정시 -> 해당 영역 안에서만 접근 가능.
protected 지정시 -> 상속 관계가 있는 클래스에서만 접근 가능.
default 지정시(아무것도 안썼을때) -> 같은 패키지 내에서만 접근 가능.

Class08_02 -> [각주:1] (같은 패키지에 소속되어 있는 상태)
Class08_3 -> [각주:2] (다른 패키지에 소속되어 있는 상태)
Class08_4 -> [각주:3] (다른 패키지에 소속되어 있는 상태)





getter, setter

1. 메소드중에서 private 멤버변수를 위한 접근용 메소드.






이클립스 기능을 이용한 getter, setter 메소드 자동 완성





중요 예제 (클래스 자료형 선언, 객체 생성, 출력등)

이름과 전화번호를 저장할 수 있는 자료형 만들기
실행 예)
회원 수(1~10)?3
이름 전화번호(1)? hong 111-1111
이름 전화번호(2)? kim 222-2222
이름 전화번호(3)? park 333-3333
----------------
전체 회원수: 3명
----------------
이름    전화번호
hong    111-1111
kim     222-2222
park    333-3333
----------------

//Member.java (사용자 정의 클래스)

package com.test;

public class Member {

private String name, tel;

public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}

public String getTel() {
return tel;
}
public void setTel(String tel) {
this.tel = tel;
}
}


//Class11.java (main() 메소드 포함 클래스)


package com.test;

import java.util.*;

public class Class11 {
public static void main(String[] args) {

//입력
Scanner sc = new Scanner(System.in);
System.out.print("회원수 입력(1~10)?");
String num = sc.next();
int count = Integer.parseInt(num);

//이름및 전화번호 자료형 클래스 활성화 및 저장용 배열 생성
                //아래에서 사용된 Member는 사용자 정의 클래스 자료형(참조형)을 의미한다.
                //배열의 자료형 선언은 String, int, 참조형등 여러 자료형 선언이 가능하고,
                //
배열 자체가 for문등 사용자 임의의 수를 기반으로 데이터를 운용하기에 
                //매우 적합하기 때문에 이 예제에서 클래스 자료형 배열을 생성한 것이다.

Member[] members = new Member[count]; // 사용자 정의 클래스 자료형인 배열을 생성

//처리

for (int a=0; a<members.length; a++) {
System.out.printf("이름:전화번호(%d)?", (a+1));
String name = sc.next(); //이름
String tel = sc.next(); //전화번호

Member member = new Member();   // member 객체 생성 과정
member.setName(name);                //member 객체에 이름 저장(바로 윗줄에서 생성한 객체이름)
member.setTel(tel);                       //member 객체에 전화번호 저장
members[a] = member;                 //member 객체를 배열에 저장하는 과정

}

//출력

System.out.println("----------------");
System.out.printf("전체 회원수: %d명%n", count);
System.out.println("----------------");
System.out.println("이름   전화번호");
for (int a=0; a<members.length; a++) {

//members[a]는  Member 객체를 리턴할 뿐이다.
//name, tel 접근을 하려면  Member 객체에서 gerName(), gerTel()을 이용해야 한다.
// System.out.printf("%s %s %n", members[a]); 일케하면 members[a]는 자동으로 이름과 전화번호를 뿌려주지 않는다.


//캐스트 연산자 Member 유의. 추후 캐스트 연산자를 이런식으로 사용할 수 있는 케이스가 있다.
//현재 예제에서는 캐스트 연산자를 사용하지 않아도 된다.


//members[a] 에는 name 과 tel 이라는 두 저장공간이 있다.
//
출력단에서 출력할때에 members[a]라고만 기재할 경우 출력되지 않으며,
//(배열명).사용자정의클래스내메소드명()     형식으로 기재해야한다.
//
즉, (members[a]).getName()

    System.out.printf("%s    %s %n", ((Member)members[a]).getName(), ((Member)members[a]).getTel()); 
}

System.out.println("----------------");

}

}

  1. public void method1() { System.out.println("Class08_2 > method1() 호출");} void method2() { System.out.println("Class08_2 > method2() 호출");} private void method3() { System.out.println("Class08_2 > method3() 호출");} [본문으로]
  2. public void method1() { System.out.println("Class08_3 > method1() 호출");} void method2() { System.out.println("Class08_3 > method2() 호출");} private void method3() { System.out.println("Class08_3 > method3() 호출");} [본문으로]
  3. public void method1() { System.out.println("Class08_4 > method1() 호출");} void method2() { System.out.println("Class08_4 > method2() 호출");} private void method3() { System.out.println("Class08_4 > method3() 호출");} public void method4() { method3();} } [본문으로]

WRITTEN BY
빨강꼬마

,