관리 메뉴

Partially Committed

[CH07] 객체지ν–₯ν”„λ‘œκ·Έλž˜λ°3 (OOP) λ³Έλ¬Έ

πŸ’» Study !/JAVA

[CH07] 객체지ν–₯ν”„λ‘œκ·Έλž˜λ°3 (OOP)

WonderJay 2022. 8. 1. 18:24
728x90
λ°˜μ‘ν˜•
SMALL

λ³Έ ν¬μŠ€νŒ…μ€ μžλ°”μ˜ 정석 ꡐ재λ₯Ό κ³΅λΆ€ν•˜λ©°, κ°„λ‹¨νžˆ 정리/기둝 μš©λ„λ‘œ μž‘μ„±ν•˜μ˜€μŠ΅λ‹ˆλ‹€. ν˜Ήμ—¬, 잘λͺ»λœ λ‚΄μš©μ΄ μžˆλ‹€λ©΄ μ§€μ ν•΄μ£Όμ‹œλ©΄ κ°μ‚¬ν•˜κ² μŠ΅λ‹ˆλ‹€.

 

 


1. package 와 import

  [νŒ¨ν‚€μ§€; package]

  νŒ¨ν‚€μ§€λŠ” 클래슀 ν˜Ήμ€ μΈν„°νŽ˜μ΄μŠ€λ₯Ό ν¬ν•¨μ‹œν‚¬ 수 μžˆμ–΄μ„œ μ„œλ‘œ κ΄€λ ¨λœ ν΄λž˜μŠ€λ“€λΌλ¦¬ κ·Έλ£Ή λ‹¨μœ„λ‘œ λ¬Άμ–΄ λ†“μŒμœΌλ‘œμ¨ 클래슀λ₯Ό 효율적으둜 관리할 수 μžˆλ„λ‘ ν•œλ‹€. ν•˜λ‚˜μ˜ μ†ŒμŠ€ νŒŒμΌμ—λŠ” 첫 번째 λ¬Έμž₯으둜 ν•œ ν•œ 번의 νŒ¨ν‚€μ§€ μ„ μ–Έλ§Œμ„ ν—ˆμš©ν•˜λ©°, λͺ¨λ“  ν΄λž˜μŠ€λŠ” λ°˜λ“œμ‹œ ν•˜λ‚˜μ˜ νŒ¨ν‚€μ§€μ— 속해야 ν•œλ‹€. λ˜ν•œ νŒ¨ν‚€μ§€λŠ” 점을 κ΅¬λΆ„μžλ‘œ 계측ꡬ쑰λ₯Ό ꡬ성할 수 있으며, 물리적으둜 .class νŒŒμΌμ„ ν¬ν•¨ν•˜λŠ” ν•˜λ‚˜μ˜ 디렉토리이닀.

 

  νŒ¨ν‚€μ§€ 선언문은 ν•˜λ‚˜μ˜ μ†ŒμŠ€ 파일 λ‹Ή 1 번만 선언될 수 μžˆλ‹€. 클래슀λͺ…κ³Ό κ΅¬λΆ„ν•˜κΈ° μœ„ν•΄ μ†Œλ¬Έμžλ₯Ό μ‚¬μš©ν•˜λ„λ‘ ν•˜λ©°, νŒ¨ν‚€μ§€λ₯Ό μ„ μ–Έν•˜μ§€ μ•ŠλŠ” κ²½μš°λ„€λŠ” 기본적으둜 μžλ°”μ—μ„œ μ œκ³΅ν•˜λŠ” unnamed package 떄문에 λ¬Έμ œκ°€ μ—†λ˜ 것이닀. μžμ‹ μ΄ 속할 νŒ¨ν‚€μ§€λ₯Ό μ„ μ–Έν•˜μ§€ μ•Šμ€ μ†ŒμŠ€ νŒŒμΌμ€ μžλ™μ μœΌλ‘œ unnamed package 에 μ†ν•˜κ²Œ λœλ‹€. μ΄λŠ” νŒ¨ν‚€μ§€λ₯Ό μ„ μ–Έν•˜μ§€ μ•Šμ€ λͺ¨λ“  ν΄λž˜μŠ€λ“€μ€ λ™μΌν•œ unnamed package 에 μ†ν•˜κ²Œ λœλ‹€λŠ” 것을 μ˜λ―Έν•œλ‹€. 큰 ν”„λ‘œμ νŠΈλ‚˜ Java API 와 같은 클래슀 라이브러리λ₯Ό μž‘μ„±ν•΄μ•Όν•˜λŠ” κ²½μš°μ—λŠ” 미리 νŒ¨ν‚€μ§€λ₯Ό κ΅¬μ„±ν•˜μ—¬ μ μš©ν•˜λŠ” 것이 μ’‹λ‹€.

 

[import 문의 μ„ μ–Έ]

  λ‹€λ₯Έ νŒ¨ν‚€μ§€μ˜ 클래슀λ₯Ό μ‚¬μš©ν•˜λ €λ©΄ ν•΄λ‹Ή νŒ¨ν‚€μ§€λͺ…이 ν¬ν•¨λœ 클래슀 이름을 μ‚¬μš©ν•΄μ•Ό ν•œλ‹€. ν•˜μ§€λ§Œ μ΄λŠ” 맀우 번거둜운 일이닀. μ½”λ“œ μž‘μ„± 이전에 import λ¬ΈμœΌλ‘œ μ‚¬μš©ν•˜κ³ μž ν•˜λŠ” 클래슀의 νŒ¨ν‚€μ§€λ₯Ό 미리 λͺ…μ‹œν•΄μ£Όλ©΄ νŒ¨ν‚€μ§€λͺ…은 μƒλž΅ν•  수 μžˆλ‹€. import λ¬Έμ„ μ„ μ–Έν•¨μœΌλ‘œμ¨ μ»΄νŒŒμΌλŸ¬μ—κ²Œ μ†ŒμŠ€νŒŒμΌμ— μ‚¬μš©λœ 클래슀 νŒ¨ν‚€μ§€μ— λŒ€ν•œ 정보λ₯Ό μ œκ³΅ν•  수 μžˆλ‹€. μ»΄νŒŒμΌλŸ¬λŠ” import 문을 ν†΅ν•΄μ„œ source file μ—μ„œ μ‚¬μš©ν•˜κ³  μžˆλŠ” ν΄λž˜μŠ€λ“€μ˜ νŒ¨ν‚€μ§€λ₯Ό νŒŒμ•…ν•˜μ—¬, λͺ¨λ“  클래슀 이름 μ•žμ— νŒ¨ν‚€μ§€ λͺ…을 λΆ™μ—¬μ€€λ‹€. 

 

  일반적으둜 μ†ŒμŠ€νŒŒμΌ(*.java)은 packageλ¬Έ - importλ¬Έ - class μ„ μ–Έμ˜ μˆœμ„œλ‘œ λ˜μ–΄μžˆλ‹€. import 문을 μ„ μ–Έν•˜λŠ” 방법은 import 뒀에 νŒ¨ν‚€μ§€λͺ….클래슀λͺ…을 λΆ™μ΄κ±°λ‚˜, νŒ¨ν‚€μ§€λͺ….* 을 뢙이면 λœλ‹€. * λ₯Ό μ‚¬μš©ν•˜λ©΄ ν•΄λ‹Ή νŒ¨ν‚€μ§€μ˜ λͺ¨λ“  클래슀λ₯Ό μ‚¬μš©ν•œλ‹€λŠ” κ²ƒμœΌλ‘œ, μ»΄νŒŒμΌλŸ¬λŠ” ν•΄λ‹Ή νŒ¨ν‚€μ§€μ—μ„œ μΌμΉ˜ν•˜λŠ” 클래슀의 이름을 μ°ΎλŠ” 일을 μˆ˜ν–‰ν•΄μ•Ό ν•˜μ§€λ§Œ μ‹€ν–‰ μ‹œ μ„±λŠ₯μƒμ˜ μ°¨μ΄λŠ” μ „ν˜€ μ—†λ‹€. import 문은 ν”„λ‘œκ·Έλž¨μ˜ μ„±λŠ₯에 μ „ν˜€ 영ν–₯을 주지 μ•Šκ³ , import 문을 많이 μ‚¬μš©ν•˜λ©΄ 컴파일 μ‹œκ°„μ΄ μ•„μ£Ό 쑰금 증가할 뿐이닀. μœ μ˜ν•΄μ•Όν•  점은 νŒ¨ν‚€μ§€λͺ….* 와 같이 import λ₯Ό ν•  κ²½μš°μ—λŠ” ν•˜μœ„ νŒ¨ν‚€μ§€μ˜ ν΄λž˜μŠ€κΉŒμ§€ ν¬ν•¨ν•˜μ§€λŠ” μ•ŠλŠ” λ‹€λŠ” 것이닀.

import java.text.SimpleDateFormat;
import java.util.Date;

class source{
    public static void main(String[] args) {
        Date today = new Date();

        SimpleDateFormat date = new SimpleDateFormat("yyyy/MM/dd");
        SimpleDateFormat time = new SimpleDateFormat("hh:mm:ss a");

        System.out.println("date = " + date.format(today));
        System.out.println("time = " + time.format(today));
    }
}

[static import λ¬Έ]

static import λ₯Ό μ‚¬μš©ν•˜λ©΄ static 멀버λ₯Ό ν˜ΈμΆœν•  λ•Œ 클래슀의 이름을 μƒλž΅ν•  수 μžˆλ‹€. νŠΉμ • 클래슀의 static 멀버λ₯Ό 자주 μ‚¬μš©ν•˜λŠ” κ²½μš°μ— νŽΈλ¦¬ν•˜λ©°, μ½”λ“œκ°€ 간단해진닀.

import static java.lang.System.out;
import static java.lang.Math.*;

class source{
    public static void main(String[] args) {
        //System.out.println(Math.random());
        out.println(random());
        out.println(PI);
    }
}

2. μ œμ–΄μž(Modifier)

  [μ œμ–΄μžλž€?]

λ©”μ„œλ“œ 선언뢀에 μ‚¬μš©λ˜μ–΄ 뢀가적인 의미/κΈ°λŠ₯을 λΆ€μ—¬ν•œλ‹€. μ ‘κ·Ό μ œμ–΄μžμ™€ κ·Έ μ™Έ μ œμ–΄μžλ‘œ ꡬ뢄할 수 μžˆλ‹€.

μ ‘κ·Ό μ œμ–΄μžλŠ” public, protected, default, private κ°€ 있고 μ™Έμ—λŠ” static, final, abstract, native, transient, synchronized, volatile, strictfp κ°€ μžˆλ‹€. 멀버 λ³€μˆ˜μ™€ λ©”μ„œλ“œ, ν΄λž˜μŠ€μ— μ‚¬μš©λ˜λ©° μ—¬λŸ¬ μ œμ–΄μžλ₯Ό μ‘°ν•©ν•˜μ—¬ μ‚¬μš©ν•  수 μžˆλ‹€. λ‹€λ§Œ μ ‘κ·Ό μ œμ–΄μžλŠ” μ—¬λŸ¬ 개λ₯Ό μ‘°ν•©ν•˜μ—¬ μ‚¬μš©ν•  수 μ—†λ‹€.

 

Static - 클래슀의, 곡톡적인

  static μ€ '클래슀의' λ˜λŠ” '곡톡적인' μ΄λΌλŠ” 의미λ₯Ό 가지고 μžˆλ‹€. μΈμŠ€ν„΄μŠ€ λ³€μˆ˜λŠ” ν•˜λ‚˜μ˜ ν΄λž˜μŠ€λ‘œλΆ€ν„° μƒμ„±λ˜μ–΄λ„ 각각 λ‹€λ₯Έ 값을 κ°€μ§€μ§€λ§Œ static λ³€μˆ˜λŠ” 같은 값을 가진닀.(곡유) static ν‚€μ›Œλ“œκ°€ 뢙은 λ©€λ²„λ³€μˆ˜, λ©”μ„œλ“œ, μ΄ˆκΈ°ν™”λΈ”λŸ­μ€ μΈμŠ€ν„΄μŠ€μ™€ 관계 없이 ν΄λž˜μŠ€μ™€λ§Œ κ΄€κ³„λœ 것이기 λ•Œλ¬Έμ— μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜μ§€ μ•Šκ³ λ„ μ‚¬μš©μ΄ κ°€λŠ₯ν•˜λ‹€. μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œμ™€ static λ©”μ„œλ“œμ˜ 차이점을 λ¬Όμ–΄λ³Έλ‹€λ©΄, λ§€μ„œλ“œ λ‚΄μ—μ„œ μΈμŠ€ν„΄μŠ€ 멀버λ₯Ό μ‚¬μš©ν•˜λŠλƒ μ—¬λΆ€κ°€ 핡심이닀.

 

  static λ©€λ²„λ³€μˆ˜λŠ” λͺ¨λ“  μΈμŠ€ν„΄μŠ€μ— λŒ€ν•˜μ—¬ κ³΅ν†΅μ μœΌλ‘œ μ‚¬μš©λ˜λŠ” 클래슀 λ³€μˆ˜μ΄λ©°, μΈμŠ€ν„΄μŠ€ 생성 없이도 μ‚¬μš©μ΄ κ°€λŠ₯ν•˜κ³  ν΄λž˜μŠ€κ°€ λ©”λͺ¨λ¦¬μ— λ‘œλ“œλ  λ•Œ μƒμ„±λœλ‹€.

  static λ©”μ„œλ“œλŠ” μΈμŠ€ν„΄μŠ€ 생성 없이 호좜 κ°€λŠ₯ν•œ λ©”μ„œλ“œλ‘œ, static λ©”μ„œλ“œ λ‚΄μ—μ„œλŠ” μΈμŠ€ν„΄μŠ€ 멀버λ₯Ό μ§μ ‘μ μœΌλ‘œ μ ‘κ·Όν•  수 μ—†λ‹€.

 

  κ°€λŠ₯ν•˜λ©΄ static λ©”μ„œλ“œλ‘œ μ„ μ–Έν•˜λŠ” 것이 μΈμŠ€ν„΄μŠ€ 생성 없이도 호좜이 κ°€λŠ₯ν•˜λ―€λ‘œ νš¨μœ¨μ μ΄λ‹€. μΈμŠ€ν„΄μŠ€ 멀버λ₯Ό μ‚¬μš©ν•˜κ³  μžˆμ§€ μ•Šλ‹€λ©΄ static λ©”μ„œλ“œλ‘œ μ„ μ–Έν•˜λŠ” 것을 κ³ λ €ν•΄λ³΄λŠ” 것이 μ’‹λ‹€.

 

Final - λ§ˆμ§€λ§‰μ˜, 변경될 수 μ—†λŠ”

  final μ€ 클래슀, λ©”μ„œλ“œ, λ©€λ²„λ³€μˆ˜, μ§€μ—­λ³€μˆ˜μ— μ‚¬μš©ν•  수 있으며 λ³€μˆ˜μ— μ‚¬μš©ν•  κ²½μš°μ—λŠ” μƒμˆ˜κ°€ 되고 λ©”μ„œλ“œμ— μ‚¬μš©ν•˜λ©΄ μ˜€λ²„λΌμ΄λ”©μ΄ λΆˆκ°€λŠ₯해지며 ν΄λž˜μŠ€μ— μ‚¬μš©ν•˜λ©΄ 자기 μžμ‹ μ„ ν™•μž₯ν•˜λŠ” μžμ† 클래슀λ₯Ό μ •μ˜ν•  수 μ—†κ²Œ λœλ‹€. final ν΄λž˜μŠ€λŠ” λ³€κ²½ν•  수 μ—†λŠ”(ν™•μž₯ λΆˆκ°€λŠ₯ν•œ) 클래슀이며, final λ©”μ„œλ“œλŠ” 변경될 수 μ—†λŠ” λ©”μ„œλ“œλ‘œ μ˜€λ²„λΌμ΄λ”©μ„ ν†΅ν•œ μž¬μ •μ˜κ°€ λΆˆκ°€λŠ₯ν•˜λ‹€. final λ©€λ²„λ³€μˆ˜ ν˜Ήμ€ 지역 λ³€μˆ˜λŠ” μƒμˆ˜λ‘œμ„œ λ™μž‘ν•œλ‹€.

 

final class FinalTest{

final int MAX_SIZE = 10;

final void getMaxSize() {

final int LV = MAX_SIZE;

return MAX_SIZE;

     }

}

  μƒμ„±μžλ₯Ό μ΄μš©ν•œ final 멀버 λ³€μˆ˜λŠ” μƒμˆ˜μ΄κΈ° λ•Œλ¬Έμ— μ„ μ–Έκ³Ό λ™μ‹œμ— μ΄ˆκΈ°ν™”ν•˜μ§€λ§Œ, μΈμŠ€ν„΄μŠ€ λ³€μˆ˜λŠ” μƒμ„±μžμ—μ„œ μ΄ˆκΈ°ν™”λ  수 μžˆλ„λ‘ ν•  수 μžˆλ‹€. 클래슀 λ‚΄μ—μ„œ 맀개 λ³€μˆ˜λ₯Ό κ°€μ§€λŠ” μƒμ„±μžλ₯Ό λ§Œλ“€κ³ , μΈμŠ€ν„΄μŠ€λ₯Ό 생성할 λ•Œ final λ©€λ²„λ³€μˆ˜ μ΄ˆκΈ°ν™”μ— ν•„μš”ν•œ 값을 λ§€κ°œλ³€μˆ˜λ‘œλΆ€ν„° μ œκ³΅λ°›λ„λ‘ ν•˜λ©΄ λœλ‹€. μ΄λ ‡κ²Œ ν•˜λ©΄ final 멀버 λ³€μˆ˜κ°€ 각각의 μΈμŠ€ν„΄μŠ€λ§ˆλ‹€ λ‹€ λ‹€λ₯Έ 값을 가지도둝 ν•  수 μžˆλ‹€.

class Card{
    final int NUMBER;
    final String KIND;
    static int width = 100;
    static int height = 250;

    Card(String kind, int num){
        KIND = kind;
        NUMBER = num;
    }
    Card(){
        this("HEART", 1);
    }
    public String toString(){
        return KIND + " " + NUMBER;
    }
}

class source{
    public static void main(String[] args) {
        Card c = new Card("HEART" , 10);
        //c.NUMBER = 5;
        //ERROR!
        //Can't assign a value to final variable NUMBER.
        System.out.println(c.KIND);
        System.out.println(c.NUMBER);
        System.out.println(c);
    }
}

 

Abstract - μΆ”μƒμ˜, λ―Έμ™„μ„±μ˜

  Abstract 은 λ―Έμ™„μ„±μ˜ 의미λ₯Ό 가지고 μžˆμ–΄, λ©”μ„œλ“œμ˜ μ„ μ–ΈλΆ€λ§Œ μž‘μ„±ν•˜κ³  μ‹€μ œ μˆ˜ν–‰ λ‚΄μš©μ€ κ΅¬ν˜„ν•˜μ§€ μ•Šμ€ 좔상 λ©”μ„œλ“œ μ„ μ–Έ μ‹œ μ‚¬μš©λœλ‹€.클래슀, λ©”μ„œλ“œμ— μ‚¬μš©ν•  수 있으며 abstract ν΄λž˜μŠ€λŠ” 클래슀 내에 좔상 λ©”μ„œλ“œκ°€ μ„ μ–Έλ˜μ–΄ μžˆμŒμ„ μ˜λ―Έν•˜λŠ” 것이고 abstract λ©”μ„œλ“œλŠ” 좔상 λ©”μ„œλ“œ(μ„ μ–ΈλΆ€λ§Œ μž‘μ„±λœ λ©”μ„œλ“œ) μž„μ„ μ˜λ―Έν•œλ‹€. 좔상 ν΄λž˜μŠ€λŠ” 좔상 λ©”μ„œλ“œκ°€ μ‘΄μž¬ν•˜λŠ” 클래슀이기 λ•Œλ¬Έμ— μΈμŠ€ν„΄μŠ€λ₯Ό 생성할 수 μ—†λ‹€. μžμ„Έν•œ λ‚΄μš©μ€ 좔후에 닀루도둝 ν•˜μž.

 

μ ‘κ·Ό μ œμ–΄μž(Access modifier)

  μ ‘κ·Ό μ œμ–΄μžλŠ” 멀버, ν΄λž˜μŠ€μ— μ‚¬μš©ν•  수 μžˆλ‹€. μ™ΈλΆ€μ—μ„œ μ ‘κ·Όν•  수 μžˆλŠ” λ²”μœ„λ₯Ό μ œν•œν•˜λŠ” 역할을 ν•œλ‹€. private λŠ” 같은 클래슀 λ‚΄μ—μ„œλ§Œ 접근이 κ°€λŠ₯ν•œ 것이고, default λŠ” 같은 νŒ¨ν‚€μ§€ λ‚΄μ—μ„œλ§Œ 접근이 κ°€λŠ₯ν•˜κ³  protected λŠ” 같은 νŒ¨ν‚€μ§€ 내와 λ‹€λ₯Έ νŒ¨ν‚€μ§€μ˜ μžμ† ν΄λž˜μŠ€μ—μ„œ 접근이 κ°€λŠ₯ν•œ 것이닀. public 은 μ•„λ¬΄λŸ° μ ‘κ·Ό μ œν•œμ΄ μ—†λ‹€.

 

public > protected > default > private

 

ν΄λž˜μŠ€μ—λŠ” public, default λ₯Ό μ‚¬μš©ν•  수 있고 λ©”μ„œλ“œ, λ©€λ²„λ³€μˆ˜μ—λŠ” public, protected, default, private λ₯Ό μ‚¬μš©ν•  수 있으며 지역 λ³€μˆ˜μ—λŠ” μ‚¬μš©ν•  수 μ—†λ‹€.

 

μ ‘κ·Ό μ œμ–΄μžλ₯Ό μ‚¬μš©ν•˜λŠ” λͺ©μ μ€ 클래슀 λ‚΄λΆ€ λ³€μˆ˜μ˜ 보호λ₯Ό μœ„ν•œ κ²ƒμœΌλ‘œ, 데이터가 μœ νš¨ν•œ 값을 μœ μ§€ν•˜κ³  λ³΄μ•ˆμ„ μœ μ§€ν•˜κΈ° μœ„ν•¨μ΄λ‹€. 이λ₯Ό 데이터 감좔기(data hiding), μΊ‘μŠν™”(encasulation) 이라고 ν•œλ‹€. λ˜ν•œ 클래슀 λ‚΄μ—μ„œλ§Œ μ‚¬μš©λ˜λŠ” 멀버 λ³€μˆ˜λ‚˜ λ©”μ„œλ“œμ™€ 같은 멀버듀을 클래슀 내뢀에 감좀으둜써 λ³΅μž‘μ„±μ„ 쀄일 수 μžˆλ‹€.

 

μ ‘κ·Ό μ œμ–΄μžλ₯Ό μ‚¬μš©ν•˜λŠ” 이유

1. μ™ΈλΆ€λ‘œλΆ€ν„° 데이터λ₯Ό λ³΄ν˜Έν•˜κΈ° μœ„ν•΄μ„œ

2. μ™ΈλΆ€μ—λŠ” λΆˆν•„μš”ν•œ, λ‚΄λΆ€μ μœΌλ‘œλ§Œ μ‚¬μš©λ˜λŠ” 뢀뢄을 감좔기 μœ„ν•΄μ„œ

 

μ–΄λ–€ λ©”μ„œλ“œλ₯Ό λ³€κ²½ν•΄μ•Όν•˜λŠ” μž‘μ—…μ΄ ν•„μš”ν•˜λ‹€κ³  κ°€μ •ν•΄λ³΄μž. ν•΄λ‹Ή λ©”μ„œλ“œκ°€ public 이라면, λ©”μ„œλ“œλ₯Ό λ³€κ²½ν•œ 뒀에 μ „μ²΄μ μœΌλ‘œ ν…ŒμŠ€νŠΈλ₯Ό 거쳐야 ν•œλ‹€. default 라면 같은 νŒ¨ν‚€μ§€ λ‚΄μ—μ„œλ§Œ ν…ŒμŠ€νŠΈν•˜λ©΄ 되고, private 라면 같은 클래슀 λ‚΄μ—μ„œλ§Œ 확인해주면 λœλ‹€. 이와 같이 μ ‘κ·Ό μ œμ–΄μžλ₯Ό μ–΄λ–»κ²Œ μ§€μ •ν•˜λŠλƒμ— λ”°λΌμ„œ μž‘μ—… λΆ€ν•˜λŠ” 크게 달라진닀.

public class source{
    public int hour;
    public int miniute;
    public int second;
    public static void main(String[] args) {
        source t = new source();
        t.hour = 25;
    }
}

 

μœ„μ™€ 같은 ν΄λž˜μŠ€κ°€ μžˆλ‹€κ³  ν•˜μž. μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•œ λ‹€μŒ hour 값을 25 둜 λ°”κΏ”μ£Όμ—ˆλ‹€. 근데 사싀 hour 이 25 κ°€ 되면 데이터 무결성에 μœ„λ°˜λœλ‹€. 이와 같이 멀버 λ³€μˆ˜μ˜ 값을 μœ νš¨ν•˜μ§€ μ•Šκ²Œ λ³€κ²½ν•˜λŠ” μž‘μ—…μ— λŒ€ν•œ μ•„λ¬΄λŸ° λŒ€μ‘μ±…μ΄ μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ”λ‹€. μ΄λŸ¬ν•œ 경우, 멀버 λ³€μˆ˜λ₯Ό private λ‚˜ protected 둜 μ œν•œν•˜κ³  멀버 λ³€μˆ˜μ˜ 값을 λ³€κ²½ν•˜κ³  읽을 수 μžˆλŠ” public λ©”μ„œλ“œλ₯Ό μ œκ³΅ν•˜μ—¬ κ°„μ ‘μ μœΌλ‘œ λ©€λ²„λ³€μˆ˜μ˜ 값을 λ‹€λ£° 수 있게 ν•˜μ—¬, 데이터λ₯Ό μœ νš¨ν•˜κ²Œ λ§Œλ“€ 수 μžˆλ„λ‘ ν•  수 μžˆλ‹€.

public class source{
    private int hour;
    private int minute;
    private int second;
    
    public int getHour(){return hour;}
    public void setHour(int hour){
        if(hour<0 || hour>23) return;
        this.hour = hour;
    }
    public int getMinute(){return minute;}
    public void setMinute(int minute){
        if(minute<0 || minute>59) return;
        this.minute = minute;
    }
    public int getSecond(){return second;}
    public void setSecond(int second){
        if(second<0 || second>59) return;
        this.second = second;
    }
}

이와 같이 getter, setter 을 λ§Œλ“€μ–΄ λ°μ΄ν„°μ˜ μœ νš¨μ„±μ„ μœ„λ°˜ν•˜μ§€ μ•Šλ„λ‘ μ œν•œν•  수 μžˆλ‹€.

 

  [μƒμ„±μžμ˜ μ ‘κ·Ό μ œμ–΄μž]

μƒμ„±μžμ— μ ‘κ·Ό μ œμ–΄μžλ₯Ό μ‚¬μš©ν•˜μ—¬ μΈμŠ€ν„΄μŠ€ 생성을 μ œν•œν•  수 μžˆλ‹€. μƒμ„±μžλ₯Ό private 둜 μ§€μ •ν•˜λ©΄ μ™ΈλΆ€μ—μ„œ μƒμ„±μžμ— μ ‘κ·Όν•  수 μ—†κ²Œ λ˜μ–΄, μΈμŠ€ν„΄μŠ€λ₯Ό 생성할 수 μ—†κ³  였직 클래슀 λ‚΄λΆ€μ—μ„œλ§Œ μΈμŠ€ν„΄μŠ€λ₯Ό 생성할 수 있게 λ˜λŠ” 것이닀.

final class Singleton {
    private static Singleton s = new Singleton();
    private Singleton(){
        //
    }
    public static Singleton getInstance() {
        return s;
    }

}

μœ„μ™€ 같이 μƒμ„±μžλ₯Ό  private 둜 μ„€μ •ν•˜μ—¬, μΈμŠ€ν„΄μŠ€λ₯Ό μ§μ ‘μ μœΌλ‘œ μƒμ„±ν•˜μ§€ λͺ»ν•˜λ„둝 ν•œλ‹€. 그리고 public λ©”μ„œλ“œλ₯Ό ν†΅ν•΄μ„œ μΈμŠ€ν„΄μŠ€μ— μ ‘κ·Όν•˜λ„λ‘ ν•¨μœΌλ‘œμ¨ μ‚¬μš©κ°€λŠ₯ν•œ μΈμŠ€ν„΄μŠ€ 개수λ₯Ό μ œν•œν•  수 μžˆλ‹€. μœ μ˜ν•΄μ•Όν•  점은 μƒμ„±μžκ°€ private 인 ν΄λž˜μŠ€λŠ” λ‹€λ₯Έ 클래슀의 쑰상이 될 수 μ—†λ‹€. μžμ† ν΄λž˜μŠ€λŠ” μΈμŠ€ν„΄μŠ€κ°€ 생성될 λ•Œ, 상속받은 클래슀의  μƒμ„±μžλ₯Ό ν˜ΈμΆœν•˜λŠ”λ° μœ„μ˜ 경우 private 둜 λ˜μ–΄μžˆκΈ° λ•Œλ¬Έμ— 호좜이 λΆˆκ°€λŠ₯해진닀. κ·Έλž˜μ„œ μ΄λŸ¬ν•œ κ²½μš°μ—λŠ” ν•΄λ‹Ή ν΄λž˜μŠ€μ— final ν‚€μ›Œλ“œλ₯Ό λΆ™μ—¬μ„œ, 더 이상 상속할 수 μ—†λŠ” ν΄λž˜μŠ€μž„μ„ λͺ…μ‹œν•˜λŠ” 것이 μ’‹λ‹€ .

 

  [μ œμ–΄μž;modifiler 의 μ‘°ν•©]

더 λ‹€μ–‘ν•œ μ œμ–΄μžλ“€μ΄ μ‘΄μž¬ν•˜μ§€λ§Œ, 일단 이 μ •λ„λ‘œλ§Œ μ •λ¦¬ν•˜λ„λ‘ ν•˜μž. μ•„λž˜λŠ” λŒ€μƒμ— 따라 μ‚¬μš© κ°€λŠ₯ν•œ μ œμ–΄μžλ“€μ΄λ‹€.

 

클래슀 : public, default, final, abstract

λ©”μ„œλ“œ : λͺ¨λ“  μ ‘κ·Ό μ œμ–΄μž, final, abstract, static

λ©€λ²„λ³€μˆ˜ : λͺ¨λ“  μ ‘κ·Ό μ œμ–΄μž, final, static

μ§€μ—­λ³€μˆ˜ : final

 

μ œμ–΄μžλ₯Ό μ‘°ν•©ν•˜μ—¬ μ‚¬μš©ν•  λ•Œμ—λŠ” λͺ‡ 가지 쑰심해야할 점이 μžˆλ‹€.

 

1. λ©”μ„œλ“œμ— static κ³Ό abstract λ₯Ό 같이 μ‚¬μš©ν•  수 μ—†λ‹€.

:  static λ©”μ„œλ“œλŠ” λͺΈν†΅μ΄ μžˆλŠ” λ©”μ„œλ“œμ—λ§Œ μ‚¬μš©μ΄ κ°€λŠ₯ν•˜λ‹€.

2. ν΄λž˜μŠ€μ— abstract 와 final 을 λ™μ‹œμ— μ‚¬μš©ν•  수 μ—†λ‹€.

:  ν΄λž˜μŠ€μ— μ‚¬μš©λ˜λŠ” final 은 클래슀λ₯Ό ν™•μž₯ν•  수 μ—†λ‹€λŠ” 의미이고 abstract λŠ” 상속을 톡해 μ™„μ„±λ˜μ–΄μ•Ό ν•œλ‹€λŠ” κ²ƒμ΄λ―€λ‘œ μ„œλ‘œ λͺ¨μˆœλœλ‹€.

3. abstract λ©”μ„œλ“œμ˜ μ ‘κ·Ό μ œμ–΄μžκ°€ private 일 μˆ˜λŠ” μ—†λ‹€.

:  abstract λ©”μ„œλ“œλŠ” μžμ† ν΄λž˜μŠ€μ—μ„œ κ΅¬ν˜„ν•΄μ•Ό ν•˜λŠ”λ° μ ‘κ·Ό μ œμ–΄μžκ°€ private 이면 μžμ† ν΄λž˜μŠ€μ—μ„œ 접근이 λΆˆκ°€λŠ₯해진닀.

4. λ©”μ„œλ“œμ— private 와 final 을 같이 μ‚¬μš©ν•˜λŠ” 것은 λΉ„νš¨μšΈμ μ΄λ‹€.

:  μ ‘κ·Ό μ œμ–΄μžκ°€ private 이면 μ˜€λ²„λΌμ΄λ”© 될 수 μ—†λ‹€. λ‘˜ 쀑 ν•˜λ‚˜λ§Œ μ‚¬μš©ν•΄λ„ μΆ©λΆ„ν•˜λ‹€.

 

3.  λ‹€ν˜•μ„±(polymorphism)

  [λ‹€ν˜•μ„±μ˜ μ •μ˜]

 λ‹€ν˜•μ„±(polymorphism)μ΄λž€ μ—¬λŸ¬ 가지 ν˜•νƒœλ₯Ό κ°€μ§ˆ 수 μžˆλŠ” λŠ₯λ ₯을 λ§ν•œλ‹€. μžλ°”μ—μ„œλŠ” 쑰상 클래슀 νƒ€μž…μ˜ μ°Έμ‘° λ³€μˆ˜λ‘œ μžμ† 클래슀의 μΈμŠ€ν„΄μŠ€λ₯Ό μ°Έμ‘°ν•  수 μžˆλ„λ‘ ν•˜μ—¬ λ‹€ν˜•μ„±μ„ κ΅¬ν˜„ν•˜μ˜€λ‹€. μ•„λž˜μ˜ μ½”λ“œλ₯Ό 보자.

class Tv{
    boolean power;
    int channel;
    
    void power(){ };
    void channelUp(){};
    void channelDown(){};
}
class CaptionTv extends Tv{
    String text;
    void caption() {};
}

μœ„μ™€ 같은 κ΄€κ³„μ—μ„œ 보톡 μ•„λž˜μ™€ 같이 μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜μ—¬ μ°Έμ‘°ν•˜μ˜€λ‹€.

 

Tv t = new Tv();

CaptionTv c = new CaptionTv();

 

ν•˜μ§€λ§Œ μ•„λž˜μ™€ 같이 ν•  μˆ˜λ„ μžˆλ‹€.

 

CaptionTv c = new CaptionTv();

Tv t = new CaptionTv();

 

쑰상 클래슀 νƒ€μž…μ˜ μ°Έμ‘° λ³€μˆ˜λ‘œ μžμ‹ 클래슀 μΈμŠ€ν„΄μŠ€λ₯Ό μ°Έμ‘°ν•œ 것이닀. κ·Έλ ‡λ‹€λ©΄ 같은 νƒ€μž…μ˜ μ°Έμ‘° λ³€μˆ˜λ‘œ μΈμŠ€ν„΄μŠ€λ₯Ό μ°Έμ‘°ν•œ 것과, λ‹€λ₯Έ νƒ€μž…(쑰상 클래슀)의 μ°Έμ‘° λ³€μˆ˜λ‘œ μΈμŠ€ν„΄μŠ€λ₯Ό μ°Έμ‘°ν•œ 것은 μ–΄λ– ν•œ 차이가 μžˆμ„κΉŒ? 쑰상 클래슀 νƒ€μž…μ˜ μ°Έμ‘° λ³€μˆ˜λ‘œ μžμ‹ 클래슀의 μΈμŠ€ν„΄μŠ€λ₯Ό μ°Έμ‘°ν•˜λŠ” κ²½μš°μ—λŠ” 쑰상 클래슀의 멀버(상속받은 멀버)만 μ‚¬μš©ν•  수 μžˆλ‹€. 즉, 쑰상 클래슀 νƒ€μž…μœΌλ‘œ μ°Έμ‘°ν•˜λ©΄ CaptionTv μΈμŠ€ν„΄μŠ€ μ€‘μ—μ„œ Tv ν΄λž˜μŠ€μ—μ„œ μ •μ˜λ˜μ§€ μ•Šμ€ λ©€λ²„λŠ” μ‚¬μš©ν•˜μ§€ λͺ»ν•œλ‹€λŠ” 것이닀. κ°™μ€ νƒ€μž…μ˜ μΈμŠ€ν„΄μŠ€μ΄μ§€λ§Œ μ°Έμ‘° λ³€μˆ˜μ˜ νƒ€μž…μ„ μ–΄λ–»κ²Œ ν•˜λŠλƒμ— λ”°λΌμ„œ μ‚¬μš© κ°€λŠ₯ν•œ λ©€λ²„μ˜ κ°œμˆ˜κ°€ λ‹¬λΌμ§„λ‹€λŠ” 것이 핡심이닀. 그럼 μžμ‹ 클래슀 νƒ€μž…μœΌλ‘œ μ°Έμ‘°λ³€μˆ˜λ₯Ό λ§Œλ“€κ³ , 쑰상 클래슀 νƒ€μž…μ˜ μΈμŠ€ν„΄μŠ€λ₯Ό μ°Έμ‘°ν•˜λŠ” 것은 κ°€λŠ₯ν• κΉŒ? λΆˆκ°€λŠ₯ν•˜λ‹€. μ™œλƒλ©΄ μ‹€μ œ μΈμŠ€ν„΄μŠ€λ³΄λ‹€ μ°Έμ‘° λ³€μˆ˜κ°€ μ‚¬μš©ν•  수 μžˆλŠ” λ©€λ²„μ˜ κ°œμˆ˜κ°€ 더 많기 λ•Œλ¬Έμ—, μ‘΄μž¬ν•˜μ§€ μ•Šμ€ 멀버λ₯Ό μ‚¬μš©ν•˜λ €κ³  ν•  수 있기 λ•Œλ¬Έμ΄λ‹€. μ°Έμ‘°λ³€μˆ˜κ°€ μ‚¬μš©ν•  수 μžˆλŠ” λ©€λ²„μ˜ κ°œμˆ˜λŠ” μΈμŠ€ν„΄μŠ€μ˜ 멀버 κ°œμˆ˜λ³΄λ‹€ κ°™κ±°μž μž‘μ•„μ•Ό ν•œλ‹€. 

 

쑰상 νƒ€μž…μ˜ μ°Έμ‘°λ³€μˆ˜λ‘œ μžμ† νƒ€μž…μ˜ μΈμŠ€ν„΄μŠ€λ₯Ό μ°Έμ‘°ν•  수 μžˆλ‹€.

μžμ† νƒ€μž…μ˜ μ°Έμ‘° λ³€μˆ˜λ‘œ 쑰상 νƒ€μž…μ˜ μΈμŠ€ν„΄μŠ€λ₯Ό μ°Έμ‘°ν•  μˆ˜λŠ” μ—†λ‹€.

 

[μ°Έμ‘° λ³€μˆ˜μ˜ ν˜•λ³€ν™˜]

  κΈ°λ³Έν˜• λ³€μˆ˜μ™€ λ§ˆμ°¬κ°€μ§€λ‘œ μ°Έμ‘°λ³€μˆ˜λ„ ν˜•λ³€ν™˜μ΄ κ°€λŠ₯ν•˜λ‹€. ν•˜μ§€λ§Œ μ˜€λ‘œμ§€ 상속 관계에 λ†“μ—¬μžˆλŠ” 클래슀 κ°„μ—μ„œλ§Œ κ°€λŠ₯ν•˜λ‹€λŠ” 것이 차이점이닀. μžμ†νƒ€μž…μ„ 쑰상 νƒ€μž…μœΌλ‘œ ν˜•λ³€ν™˜ν•˜λŠ” 것을 μ—…μΊμŠ€νŒ…μ΄λΌκ³  ν•˜λŠ”λ°, μ΄λŠ” μƒλž΅μ΄ κ°€λŠ₯ν•˜λ‹€. 반면 쑰상 νƒ€μž…μ„ μžμ† νƒ€μž…μœΌλ‘œ ν˜•λ³€ν™˜ν•˜λŠ” λ‹€μš΄ μΊμŠ€νŒ…μ€ μƒλž΅μ΄ λΆˆκ°€λŠ₯ν•˜λ‹€. μ™œλƒλ©΄ μ—…μΊμŠ€νŒ…μ„ ν•œ κ²½μš°μ—λŠ” μ°Έμ‘° λ³€μˆ˜μ˜ 멀버가 μΈμŠ€ν„΄μŠ€μ˜ 멀버보닀 μ κ±°λ‚˜ 같은 것이 보μž₯이 λ˜λŠ”λ° λ°˜ν•΄ λ‹€μš΄ μΊμŠ€νŒ…μ˜ κ²½μš°μ—λŠ” μ°Έμ‘° λ³€μˆ˜μ˜ 멀버가 μΈμŠ€ν„΄μŠ€μ˜ 멀버보닀 λ§Žμ„ 것이기 λ•Œλ¬Έμ— μƒλž΅μ΄ λΆˆκ°€λŠ₯ν•œ 것이닀. κ·Έλž˜μ„œ μ°Έμ‘°λ³€μˆ˜μ˜ ν˜•λ³€ν™˜μ€ ν•˜κΈ° 전에 instanceof μ—°μ‚°μžλ₯Ό μ΄μš©ν•΄μ„œ μ°Έμ‘°λ³€μˆ˜κ°€ μ°Έμ‘°ν•˜κ³  μžˆλŠ” μ‹€μ œ μΈμŠ€ν„΄μŠ€μ˜ νƒ€μž…μ΄ 무엇인지 μ²΄ν¬ν•˜λŠ” 것이 μ•ˆμ „ν•˜λ‹€. ν˜•λ³€ν™˜μ€ μ°Έμ‘° λ³€μˆ˜μ˜ νƒ€μž…μ„ λ³€ν™˜ν•  λΏμ΄λ―€λ‘œ μΈμŠ€ν„΄μŠ€μ™€ 관계 μ—†λ‹€. κ·Έλƒ₯ μ°Έμ‘° λ³€μˆ˜μ˜ νƒ€μž…μ„ μ‘°μ ˆν•¨μœΌλ‘œμ¨ μ°Έμ‘°ν•˜κ³  μžˆλŠ” μΈμŠ€ν„΄μŠ€μ—μ„œ μ‚¬μš©ν•  수 μžˆλŠ” λ©€λ²„μ˜ 개수λ₯Ό μ œν•œν•  뿐이닀. 

 

  Car 클래슀λ₯Ό 상속받은 FireEngine ν΄λž˜μŠ€κ°€ μžˆλ‹€κ³  κ°€μ •ν•˜μž. 그리고 Car μΈμŠ€ν„΄μŠ€λ₯Ό κ°€λ¦¬ν‚€λŠ” μ°Έμ‘°λ³€μˆ˜ car 와 FireEngine νƒ€μž…μ˜ μ°Έμ‘°λ³€μˆ˜ fe κ°€ μ£Όμ–΄μ‘Œλ‹€. fe = (FireEngine)car 와 같이 ν•˜λ©΄ down - casting μ΄λ―€λ‘œ 컴파일 상 μ•„λ¬΄λŸ° λ¬Έμ œκ°€ λ°œμƒν•˜μ§€ μ•ŠλŠ”λ‹€. ν•˜μ§€λ§Œ μ‹€μ œλ‘œ car 은 Car ν΄λž˜μŠ€μ— λŒ€ν•œ μΈμŠ€ν„΄μŠ€λ₯Ό κ°€λ¦¬ν‚€λŠ” μ°Έμ‘°λ³€μˆ˜μ΄κ³  이λ₯Ό μˆ˜ν–‰ν•˜κ²Œ 되면 결ꡭ에 μžμ† νƒ€μž…μ˜ μ°Έμ‘° λ³€μˆ˜λ‘œ 쑰상 νƒ€μž…μ˜ μΈμŠ€ν„΄μŠ€λ₯Ό μ°Έμ‘°ν•˜κ²Œ λ˜λŠ” 것이닀. μ΄λŠ” μœ„μ—μ„œ μ–ΈκΈ‰ν•˜μ˜€λ“― κ°€λŠ₯ν•˜μ§€ μ•Šμ€ 것인데, κ·ΈλŸΌμ—λ„ 컴파일 μ‹œμ—λŠ” 였λ₯˜κ°€ λ°œμƒν•˜μ§€ μ•ŠλŠ” 것은 κ·Έμ € μ°Έμ‘° λ³€μˆ˜ κ°„μ˜ κ΄€κ³„λ§Œ 따지기 λ•Œλ¬Έμ΄λ‹€. 이와 같은 경우 λ•Œλ¬Έμ— instanceof μ—°μ‚°μžλ₯Ό μ΄μš©ν•˜μ—¬ μ°Έμ‘° λ³€μˆ˜κ°€ κ°€λ¦¬ν‚€λŠ” μΈμŠ€ν„΄μŠ€μ˜ νƒ€μž…μ΄ 무엇인지 ν™•μΈν•˜λŠ” 것이 μ€‘μš”ν•˜λ‹€. μ„œλ‘œ 상속 관계에 놓여진 νƒ€μž… κ°„ ν˜•λ³€ν™˜μ€ μžμœ λ‘­μ§€λ§Œ μ°Έμ‘°λ³€μˆ˜κ°€ κ°€λ¦¬ν‚€λŠ” μΈμŠ€ν„΄μŠ€μ˜ μžμ† νƒ€μž…μœΌλ‘œμ˜ ν˜•λ³€ν™˜μ€ ν—ˆμš©λ˜μ§€ μ•ŠλŠ” 것에 μ£Όμ˜ν•˜μž.

 

[Instanceof μ—°μ‚°μž]

  μ°Έμ‘°λ³€μˆ˜κ°€ μ°Έμ‘°ν•˜κ³  μžˆλŠ” μΈμŠ€ν„΄μŠ€μ˜ νƒ€μž…μ„ μ•ŒκΈ° μœ„ν•΄ instanceof μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€. 쑰건문에 주둜 μ‚¬μš©ν•˜λ©°, μ™ΌνŽΈμ—λŠ” μ°Έμ‘°λ³€μˆ˜λ₯Ό 였λ₯ΈνŽΈμ—λŠ” νƒ€μž…(클래슀λͺ…)이 ν”Όμ—°μ‚°μžκ°€ λœλ‹€. κ²°κ³Ό 값은 true/false 의 boolean 으둜 주어지며 true λ₯Ό λ°˜ν™˜ν•œλ‹€λŠ” 것은 μ°Έμ‘°λ³€μˆ˜κ°€ testing ν•œ νƒ€μž…μœΌλ‘œμ˜ ν˜•λ³€ν™˜μ΄ λ¬Έμ œμ—†μ΄ μˆ˜ν–‰μ΄ κ°€λŠ₯ν•˜λ‹€λŠ” 것을 μ˜λ―Έν•œλ‹€.

 

void doWork(Car c){

if (c instanceof FireEngine) {

FireEngine fe = (FireEngine)c;

fe.water();

...

}

 μœ„와 같이 μ‚¬μš©ν•  수 μžˆλ‹€. μ •λ¦¬ν•˜μžλ©΄ μ–΄λ–€ νƒ€μž…μ— λŒ€ν•œ instanceof μ—°μ‚°μ˜ κ²°κ³Όκ°€ true λΌλŠ” 것은 κ²€μ‚¬ν•œ νƒ€μž…μœΌλ‘œμ˜ ν˜•λ³€ν™˜μ΄ κ°€λŠ₯ν•˜λ‹€λŠ” 것을 μ‹œμ‚¬ν•œλ‹€.

 

[μ°Έμ‘°λ³€μˆ˜μ™€ μΈμŠ€ν„΄μŠ€μ˜ μ—°κ²°]

  쑰상 ν΄λž˜μŠ€μ— μ •μ˜λ˜μ–΄ μžˆλŠ” 멀버 λ³€μˆ˜μ™€ μ€‘λ³΅λ˜λŠ” 이름을 κ°€μ§€λŠ” μΈμŠ€ν„΄μŠ€ λ³€μˆ˜λ₯Ό μžμ† ν΄λž˜μŠ€μ—μ„œλ„ μ •μ˜ν•˜μ˜€μ„ λ•Œμ—λŠ” μ°Έμ‘° λ³€μˆ˜μ˜ νƒ€μž…μ— λ”°λΌμ„œ λ‹€λ₯Έ λ³€μˆ˜λ₯Ό ν˜ΈμΆœν•œλ‹€. 쑰상 클래슀 νƒ€μž…μΈ κ²½μš°μ—λŠ” 쑰상 ν΄λž˜μŠ€μ— μ •μ˜λœ λ³€μˆ˜λ₯Ό ν˜ΈμΆœν•˜κ³ , μžμ‹ 클래슀 νƒ€μž…μΈ κ²½μš°μ—λŠ” μžμ‹ ν΄λž˜μŠ€μ— μ •μ˜λœ λ³€μˆ˜λ₯Ό ν˜ΈμΆœν•œλ‹€. λ©”μ„œλ“œμ˜ κ²½μš°μ—λŠ” μ°Έμ‘° λ³€μˆ˜μ˜ νƒ€μž…μ— 관계없이 μ‹€μ œ μΈμŠ€ν„΄μŠ€μ˜ λ©”μ„œλ“œκ°€ ν˜ΈμΆœλœλ‹€. μ•„λž˜ μ½”λ“œλ₯Ό 보자.

class source{
    public static void main(String[] args) {
        Parent p = new Child();
        Child c = new Child();

        System.out.println("p.x = " + p.x );
        p.method();
        System.out.println("c.x = " + c.x);
        c.method();
    }
}
class Parent{
    int x = 100;
    void method(){
        System.out.println("Parent Method");
    }
}
class Child extends Parent{
    int x = 200;
    void method(){
        System.out.println("Child Method");
    }
}

Parent νƒ€μž…μ˜ μ°Έμ‘°λ³€μˆ˜ p 둜 Child μΈμŠ€ν„΄μŠ€λ₯Ό μ°Έμ‘°ν•˜κ²Œ ν•˜μ˜€κ³ , Child νƒ€μž…μ˜ μ°Έμ‘°λ³€μˆ˜ c 둜 Child μΈμŠ€ν„΄μŠ€λ₯Ό μ°Έμ‘°ν•˜κ²Œ ν•˜μ˜€λ‹€. p.x λ₯Ό ν˜ΈμΆœν•œ κ²½μš°μ—λŠ” p κ°€ Parent νƒ€μž…μ˜ μ°Έμ‘°λ³€μˆ˜μ΄λ―€λ‘œ Parent ν΄λž˜μŠ€μ— μ •μ˜λœ x 값인 100 을 좜λ ₯ν•˜λŠ” 것이고 c.x λ₯Ό ν˜ΈμΆœν•œ κ²½μš°μ—λŠ” c κ°€ Child νƒ€μž…μ˜ μ°Έμ‘°λ³€μˆ˜μ΄λ―€λ‘œ Child ν΄λž˜μŠ€μ— μ •μ˜λœ x 값인 200 이 좜λ ₯λ˜λŠ” 것이닀. method() 의 κ²½μš°μ—λŠ” μ‹€μ œ μΈμŠ€ν„΄μŠ€μ˜ νƒ€μž…μ„ λ”°λΌκ°€λ―€λ‘œ Child ν΄λž˜μŠ€μ— μ •μ˜λœ method() κ°€ ν˜ΈμΆœλœλ‹€. μ•„λž˜μ™€ 같이 Child ν΄λž˜μŠ€μ— 아무것도 μž‘μ„±ν•˜μ§€ μ•ŠλŠ”λ‹€λ©΄ 상속받은 ν΄λž˜μŠ€μ™€ μ€‘λ³΅λœ 멀버 λ³€μˆ˜λ‚˜ method κ°€ μ‘΄μž¬ν•˜μ§€ μ•ˆν”λ‹€. μ΄λŸ¬ν•œ κ²½μš°μ—λŠ”μ°Έμ‘°λ³€μˆ˜μ˜ νƒ€μž…μ— λ”°λ₯Έ λ³€ν™”λŠ” μ—†λ‹€. μ°Έμ‘° λ³€μˆ˜μ˜ νƒ€μž…μ— λ”°λΌμ„œ λ‹€λ₯Έ κ²°κ³Όλ₯Ό κ°€μ Έμ˜€λŠ” κ²½μš°λŠ” μ˜€λ‘œμ§€ 쑰상 클래슀의 멀버 λ³€μˆ˜μ™€ 같은 μ΄λ¦„μ˜ λ©€λ²„λ³€μˆ˜λ₯Ό μžμ† ν΄λž˜μŠ€μ— μ€‘λ³΅ν•˜μ—¬ μ •μ˜ν•œ 경우 뿐이닀.

class source{
    public static void main(String[] args) {
        Parent p = new Child();
        Child c = new Child();

        System.out.println("p.x = " + p.x );
        p.method();
        System.out.println("c.x = " + c.x);
        c.method();
    }
}
class Parent{
    int x = 100;
    void method(){
        System.out.println("Parent Method");
    }
}
class Child extends Parent{
    // nothing
}

 

[λ§€κ°œλ³€μˆ˜μ˜ λ‹€ν˜•μ„±]

class Product{
    int price;
    int bonusPoint;

    Product(int price){
        this.price = price;
        bonusPoint = (int)(price/10.0);
    }
}
class Tv extends Product{
    Tv(){
        super(100);
    }
    public String toString(){return "Tv";}
}
class Computer extends Product{
    Computer(){
        super(200);
    }
    public String toString(){return "Computer";}
}
class Buyer{
    int money = 1000;
    int bonusPoint = 0;

    void buy(Product p){
        if(money < p.price)
        {
            System.out.println("no money");
            return;
        }
        money -= p.price;
        bonusPoint += p.bonusPoint;
        System.out.println("you have purchased " + p);
    }
}
class source{
    public static void main(String[] args) {
        Buyer b = new Buyer();

        b.buy(new Tv());
        b.buy(new Computer());

        System.out.println("balance : $" + b.money);
        System.out.println("bonus Point : " + b.bonusPoint );
    }
}

μœ„ μ½”λ“œλ₯Ό 보면, Product 의 μžμ‹ 클래슀인 Tv, Computer, Audio κ°€ 있고 Buyer ν΄λž˜μŠ€μ—μ„œ 물건을 κ΅¬μž…ν•˜λŠ” κΈ°λŠ₯이 λ‹΄κΈ΄ λ©”μ„œλ“œμΈ buy λ₯Ό μ •μ˜ν•˜μ˜€μ„ λ•Œ, λ§€κ°œλ³€μˆ˜λ₯Ό Tv, Computer, Audio λ³„λ‘œ λ”°λ‘œ κ΅¬ν˜„ν•˜μ§€ μ•Šκ³  κ³΅ν†΅μ˜ 쑰상 클래슀인 Product 둜 μ‚¬μš©ν•˜μ—¬ κ΅¬ν˜„ν•˜μ˜€λ‹€, 이와 같이 κ°€λŠ₯ν•œ 것은 λ§€κ°œλ³€μˆ˜μ—μ„œλ„ λ‹€ν˜•μ„±μ„ μ μš©ν•  수 있기 λ•Œλ¬Έμ΄λ‹€.

 

[μ—¬λŸ¬ μ’…λ₯˜μ˜ 객체λ₯Ό λ°°μ—΄λ‘œ 닀루기] 

  μœ„μ—μ„œ Product 의 μžμ‹ 클래슀인 Tv, Computer, Audio λ₯Ό 각각 κ°œλ³„μ μœΌλ‘œ λ‹€λ£¨μ—ˆλŠ”λ° Product νƒ€μž…μ˜ μ°Έμ‘°λ³€μˆ˜ λ°°μ—΄λ‘œ μ²˜λ¦¬ν•˜μ—¬ 보닀 κ°„λ‹¨ν•˜κ²Œ κ΅¬ν˜„ν•  수 μžˆλ‹€.

 

Product p[] = new Product[3];

p[0] = new Tv();

p[1] = new Computer();

p[2] = new Audio();

 

이λ₯Ό μ΄μš©ν•˜μ—¬ Buyer 클래슀λ₯Ό μˆ˜μ •ν•˜λ©΄ μ•„λž˜μ™€ κ°™λ‹€.

class Buyer{
    int money = 1000;
    int bonusPoint = 0;
    Product[] item = new Product[10];
    int i = 0;
    void buy(Product p){
        if(money < p.price)
        {
            System.out.println("no money");
            return;
        }
        money -= p.price;
        bonusPoint += p.bonusPoint;
        item[i++] = p;
        System.out.println("you have purchased " + p);
    }
}

이와 같이 μˆ˜μ •ν•˜μ—¬ λ°°μ—΄ item 에 κ΅¬μž…ν•œ 물건이 μ €μž₯λ˜λ„λ‘ κ΅¬ν˜„ν•  수 μžˆλ‹€. λͺ¨λ“  μ œν’ˆ 클래슀의 쑰상 클래슀인 Product 클래슀 νƒ€μž…μ˜ 배열을 μ‚¬μš©ν•˜μ—¬ κ΅¬μž…ν•œ μ œν’ˆμ„ ν•˜λ‚˜μ˜ λ°°μ—΄λ‘œ κ°„λ‹¨ν•˜κ²Œ λ‹€λ£° 수 있게 λ˜μ—ˆλ‹€. λ‹€λ§Œ item λ°°μ—΄μ˜ 크기λ₯Ό 10으둜 κ³ μ •ν–ˆκΈ° 떄문에 물건을 10κ°œλ³΄λ‹€ 많이 μ‚¬κ²Œλ˜λŠ” κ²½μš°μ— λŒ€ν•œ λŒ€λΉ„μ±…μ΄ μ—†λ‹€. μ΄λŸ¬ν•œ κ²½μš°μ—λŠ” 배열을 μƒˆλ‘œ λ§Œλ“€κ³ , 볡사해주면 λ˜λŠ”λ° μ΄λ³΄λ‹€λŠ” Vector 클래슀λ₯Ό μ‚¬μš©ν•˜λŠ” 것이 νš¨μœ¨μ μ΄λ‹€. Vector ν΄λž˜μŠ€λŠ” λ‚΄λΆ€μ μœΌλ‘œ Object νƒ€μž…μ˜ 배열을 가지고 있고, 크기λ₯Ό μ•Œμ•„μ„œ 관리해주기 λ•Œλ¬Έμ— μΈμŠ€ν„΄μŠ€μ˜ 개수λ₯Ό κ³ λ €ν•˜μ§€ μ•Šμ•„λ„ λœλ‹€. 

import java.util.Vector;

class Product {
    int price;
    int bonusPoint;

    Product(int price) {
        this.price = price;
        bonusPoint = (int) (price / 10.0);
    }
}

class Tv extends Product {
    Tv() {
        super(100);
    }

    public String toString() {
        return "Tv";
    }
}

class Computer extends Product {
    Computer() {
        super(200);
    }

    public String toString() {
        return "Computer";
    }
}

class Audio extends Product {
    Audio() {
        super(300);
    }

    public String toString() {
        return "Audio";
    }
}

class Buyer {
    int money = 1000;
    int bonusPoint = 0;
    Vector item = new Vector();
    int i = 0;

    void buy(Product p) {
        if (money < p.price) {
            System.out.println("no money");
            return;
        }
        money -= p.price;
        bonusPoint += p.bonusPoint;
        item.add(p);
        System.out.println("you have purchased " + p);
    }

    void refund(Product p) {
        if (item.remove(p)) {
            money += p.price;
            bonusPoint -= p.bonusPoint;
            System.out.println("you have refunded " + p);
        } else {
            System.out.println("something wrong...");
        }
    }

    void summary() {
        int sum = 0;
        String itemList = "";

        if (item.isEmpty()) {
            System.out.println("Something wrong...");
            return;
        }
        for (int i = 0; i < item.size(); i++) {
            Product p = (Product) item.get(i);
            sum += p.price;
            itemList += (i == 0) ? "" + p : ", " + p;
        }
        System.out.println("total price = $" + sum);
        System.out.println("you have purchased " + itemList);
    }
}

class source {
    public static void main(String[] args) {
        Buyer b = new Buyer();
        Tv tv = new Tv();
        Computer com = new Computer();
        Audio audio = new Audio();

        b.buy(tv);
        b.buy(com);
        b.buy(audio);
        b.summary();
        System.out.println();
        b.refund(com);
        b.summary();
    }
}

 

 


References

http://www.yes24.com/Product/Goods/24259565

 

Java의 정석 - YES24

졜근 7λ…„λ™μ•ˆ μžλ°” λΆ„μ•Όμ˜ 베슀트 μ…€λŸ¬ 1μœ„λ₯Ό μ§€μΌœμ˜¨ `μžλ°”μ˜ 정석`의 μ΅œμ‹ νŒ. μ €μžκ°€ μΉ΄νŽ˜μ—μ„œ 12λ…„κ°„ 직접 λ…μžλ“€μ—κ²Œ 닡변을 ν•΄μ˜€λ©΄μ„œ μ΄ˆλ³΄μžκ°€ μ–΄λ €μ›Œν•˜λŠ” 뢀뢄을 잘 νŒŒμ•…ν•˜κ³  μ“΄ μ±…. 뿐만 μ•„

www.yes24.com

 

 

728x90
λ°˜μ‘ν˜•
LIST
Comments