Skip to content

🌱 μžλ°”μ™€ 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ˜ 기본을 λ‹€μ§‘λ‹ˆλ‹€ 🌱

Notifications You must be signed in to change notification settings

henrywoo0/java-study

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

Java

μžλ°” μ›Ή 개발 ν”„λ ˆμž„μ›Œν¬μΈ Spring을 배우기 전에, μžλ°” 언어와 객체 지ν–₯ κ°œλ…μ˜ 기본을 νƒ„νƒ„νžˆ 닀지기 μœ„ν•΄ κ³΅λΆ€ν–ˆμŠ΅λ‹ˆλ‹€.

μ•„λž˜ λ‚΄μš©μ€ Do it! μžλ°” ν”„λ‘œκ·Έλž˜λ° μž…λ¬Έ λ„μ„œλ₯Ό μ°Έκ³ ν•˜λ©°, μ΄ν•΄ν•œ λ‚΄μš©μ„ λ°”νƒ•μœΌλ‘œ κΈ°λ‘ν–ˆμŠ΅λ‹ˆλ‹€.

λ”μš± μžμ„Έν•œ μ„€λͺ…을 μ›ν•˜μ‹œλ©΄ μœ„ 책을 직접 μ½μ–΄λ³΄μ‹œλŠ” 것을 μΆ”μ²œλ“œλ¦½λ‹ˆλ‹€.


  • μžλ°”λŠ” 1991λ…„ μ œμž„μŠ€ κ³ μŠ¬λ§μ„ λΉ„λ‘―ν•œ μ„  λ§ˆμ΄ν¬λ‘œμ‹œμŠ€ν…œμŠ€ 연ꡬ원듀이 처음 κ°œλ°œν–ˆλ‹€.
  • κ°€μ „μ œν’ˆμ΄λ‚˜ νœ΄λŒ€μš© μž₯치 등에 μ‚¬μš©ν•˜λŠ” μ†Œν”„νŠΈμ›¨μ–΄λ₯Ό λ§Œλ“€κΈ° μœ„ν•΄ λ…λ¦½μ μœΌλ‘œ μž‘λ™ν•˜λŠ” 더 μ•ˆμ •λœ ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄κ°€ ν•„μš”ν•˜μ—¬ μžλ°”κ°€ λ§Œλ“€μ–΄μ‘Œλ‹€.

μ•„λž˜λŠ” μžλ°”μ˜ νŠΉμ§•μ„ λ‚˜μ—΄ν•œ 것이닀.

ν”Œλž«νΌμ— 쒅속 X

μ°Έκ³ ) ν”Œλž«νΌ(Platform)μ΄λž€ ν”„λ‘œκ·Έλž¨μ΄ μ‹€ν–‰λ˜λŠ” ν™˜κ²½μ„ λœ»ν•œλ‹€.

  • μžλ°”μ—μ„œλŠ” .exe의 μ‹€ν–‰ 파일 λŒ€μ‹  .class의 ν™•μž₯자λ₯Ό 가진 λ°”μ΄νŠΈ μ½”λ“œλ₯Ό 생성
  • μƒμ„±λœ λ°”μ΄νŠΈ μ½”λ“œλ₯Ό μžλ°” 가상 λ¨Έμ‹ μ—μ„œ μ‹€ν–‰ν•˜μ—¬, 각 μš΄μ˜μ²΄μ œμ— λ§žλŠ” μ‹€ν–‰ 파일 생성
  • μ΄λŸ¬ν•œ νŠΉμ„±μ€ μ΄ˆλ°˜μ— ν”„λ‘œκ·Έλž¨μ˜ μ‹€ν–‰ 속도λ₯Ό μ €ν•˜μ‹œν‚¨ 원인이 λ˜μ—ˆμ§€λ§Œ, μžλ°” μ»΄νŒŒμΌλŸ¬κ°€ JIT 컴파일 λ°©μ‹μœΌλ‘œ κ°œμ„ λ˜λ©° μ‹€ν–‰ 속도가 κ°œμ„ λ¨

μ°Έκ³ ) JIT(Just In Time) μ»΄νŒŒμΌλŸ¬λŠ” μ‹€ν–‰ μ‹œμ μ— 기계어 μ½”λ“œ 생성, 같은 μ½”λ“œ 반볡일 경우 이전에 λ§Œλ“  기계어 μž¬μ‚¬μš©μ˜ νŠΉμ§•μ΄ μžˆλ‹€.

객체 지ν–₯ μ–Έμ–΄

  • 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ΄λž€ 일의 μˆœμ„œκ°€ μ•„λ‹Œ μ—¬λŸ¬ 객체의 ν˜‘λ ₯(μƒν˜Έ 관계)을 톡해 ν”„λ‘œκ·Έλž¨μ„ κ΅¬ν˜„ν•˜λŠ” 것
  • κ³΅ν†΅μœΌλ‘œ μ‚¬μš©ν•˜λŠ” 뢀뢄을 μˆ˜μ •ν•˜μ§€ μ•Šκ³ λ„ μƒˆ κΈ°λŠ₯ μ‰½κ²Œ μΆ”κ°€ κ°€λŠ₯
  • μœ μ§€λ³΄μˆ˜κ°€ 쉽고 ν™•μž₯성이 쒋은 ν”„λ‘œκ·Έλž¨μ΄ 될 수 있음

μ•ˆμ •μ μΈ ν”„λ‘œκ·Έλž¨

  • μžλ°”λŠ” 포인터 문법을 μ œκ³΅ν•˜μ§€ μ•Šμ•„ λ©”λͺ¨λ¦¬λ₯Ό 직접 μ œμ–΄ν•˜μ§€ μ•ŠμŒ. 그에 따라 였λ₯˜ μœ„ν—˜μ„±μ„ μ€„μž„
  • Garbage Collectorλ₯Ό μ΄μš©ν•΄ 동적 λ©”λͺ¨λ¦¬λ₯Ό μˆ˜κ±°ν•˜λ―€λ‘œ 효율적인 λ©”λͺ¨λ¦¬ 관리가 κ°€λŠ₯함

μ˜€ν”ˆ μ†ŒμŠ€

  • JDK(Java Development Kit)λ₯Ό 가지고 μžˆμ–΄ ν”„λ‘œκ·Έλž¨μ„ λΉ λ₯΄κ²Œ κ°œλ°œν•  수 있음
  • μžλ°”λ₯Ό ν™œμš©ν•œ μ˜€ν”ˆ μ†ŒμŠ€κ°€ 많이 κ°œλ°œλ˜μ–΄ 있기 λ•Œλ¬Έμ— κ·Έ μ†ŒμŠ€λ“€μ„ μ—°λ™ν•˜μ—¬ 더 ν’λΆ€ν•œ κΈ°λŠ₯을 λΉ λ₯΄κ²Œ κ΅¬ν˜„ν•  수 있음

μ°Έκ³ ) JDKλŠ” 클래슀, 자료 ꡬ쑰, λ„€νŠΈμ›Œν¬, μž…μΆœλ ₯, μ˜ˆμ™Έ 처리 등에 μ΅œμ ν™”λœ μ•Œκ³ λ¦¬μ¦˜ 라이브러리λ₯Ό 제곡


μžλ°” 기초

λ³€μˆ˜λͺ… μ •ν•˜κΈ°

  • λ³€μˆ˜λͺ…은 μ‚¬μš© λͺ©μ μ— 맞게 의미λ₯Ό λΆ€μ—¬ν•˜μ—¬ λ§Œλ“€μ–΄μ•Ό ν•œλ‹€.
  • 영문자(λŒ€μ†Œλ¬Έμž)와 숫자λ₯Ό μ‚¬μš©ν•  수 있고, νŠΉμˆ˜λ¬ΈμžλŠ” $, _ λ“±λ§Œ μ‚¬μš©ν•  수 μžˆλ‹€.
  • 숫자둜 μ‹œμž‘ν•  수 μ—†λ‹€.
  • μžλ°”μ—μ„œ 이미 μ‚¬μš© 쀑인 μ˜ˆμ•½μ–΄λŠ” μ‚¬μš©ν•  수 μ—†λ‹€.
  • Camel Notationμ΄λž€ 쀑간에 λ‹€λ₯Έ 뜻의 단어가 λ“±μž₯ν•˜λ©΄ 첫 κΈ€μžλ₯Ό λŒ€λ¬Έμžλ‘œ μ‚¬μš©ν•˜λŠ” 것이닀. (numberOfStudent, isGood)

μžλ°” μžλ£Œν˜•

  • μžλ°”μ—μ„œ μ œκ³΅ν•˜λŠ” μžλ£Œν˜•μ—λŠ” κΈ°λ³Έ μžλ£Œν˜•κ³Ό μ°Έμ‘° μžλ£Œν˜•μ΄ 있음
  • μ°Έμ‘° μžλ£Œν˜•μ€ ν΄λž˜μŠ€ν˜•μž„

μ•„λž˜λŠ” κΈ°λ³Έ μžλ£Œν˜•μ΄λ‹€.

  • μ •μˆ˜ν˜• : byte(1byte), short(2byte), int(4byte), long(8byte)
  • μ‹€μˆ˜ν˜• : float(4byte), double(8byte)
  • λ¬Έμžν˜• : char(2byte)
  • λ…Όλ¦¬ν˜• : boolean(1byte)

μ•„λž˜λŠ” μžλ£Œν˜•μ˜ νŠΉμ§•μ΄λ‹€.

  • long ν˜•μ€ 숫자 뒀에 L, l의 μ‹λ³„μžλ₯Ό λΆ™μ—¬μ•Ό ν•œλ‹€. λ˜ν•œ floatν˜•μ€ F, fλ₯Ό λΆ™μ—¬μ•Ό 함
  • 컴퓨터 λ‚΄λΆ€μ—μ„œ 문자λ₯Ό ν‘œν˜„ν•  λ•Œ νŠΉμ • μ •μˆ˜ κ°’μœΌλ‘œ μ •ν•œλ‹€. μ½”λ“œ 값을 λͺ¨μ•„λ‘” 것을 '문자 μ„ΈνŠΈ', 문자λ₯Ό μ½”λ“œ κ°’μœΌλ‘œ λ³€ν™˜ν•˜λŠ” 것을 '문자 인코딩', κ·Έ λ°˜λŒ€λ₯Ό '문자 λ””μ½”λ”©'이라고 함
  • μžλ°”λŠ” μœ λ‹ˆμ½”λ“œ(unicode)에 κΈ°λ°˜ν•˜μ—¬ 문자λ₯Ό ν‘œν˜„ν•˜κΈ° λ•Œλ¬Έμ—, charν˜•μ€ 2byteλ₯Ό μ‚¬μš©

μƒμˆ˜

  • μƒμˆ˜(constant)λŠ” 항상 λ³€ν•˜μ§€ μ•ŠλŠ” κ°’μž„
  • κ°’ μ΄ˆκΈ°ν™” 후에 λ‹€μ‹œ κ°’ λ³€κ²½ λΆˆκ°€
  • μƒμˆ˜λ₯Ό μ„ μ–Έν•  λ•Œ μžλ£Œν˜• μ•žμ— final을 λΆ™μž„
  • 이름은 주둜 λŒ€λ¬Έμžλ₯Ό μ‚¬μš©ν•˜κ³ , _ 기호λ₯Ό μ‚¬μš©ν•΄ μ—¬λŸ¬ 단어λ₯Ό 연결함 (PI)
  • final ν‚€μ›Œλ“œλ₯Ό 뢙인 λ©”μ„œλ“œλŠ” μ˜€λ²„λΌμ΄λ”© λΆˆκ°€λŠ₯
  • final ν‚€μ›Œλ“œλ₯Ό 뢙인 ν΄λž˜μŠ€λŠ” 상속 λΆˆκ°€λŠ₯
  • staticκ³Ό final은 λ‹€λ₯Έ 것. (static은 νŠΉμ • 클래슀의 μΈμŠ€ν„΄μŠ€ λͺ¨λ‘κ°€ κ³΅λ™μœΌλ‘œ μ‚¬μš©ν•˜λŠ” 클래슀 λ³€μˆ˜/λ©”μ„œλ“œ)

λ¦¬ν„°λŸ΄

  • ν”„λ‘œκ·Έλž¨μ—μ„œ μ‚¬μš©ν•˜λŠ” λͺ¨λ“  숫자, 문자, 논리값을 μΌμ»«λŠ” 말
  • ν”„λ‘œκ·Έλž¨μ΄ μ‹œμž‘ν•  λ•Œ μ‹œμŠ€ν…œμ— 같이 λ‘œλ”©λ˜μ–΄ constant pool에 λ†“μž„
  • 이 λ¦¬ν„°λŸ΄μ€ λ³€μˆ˜λ‚˜ μƒμˆ˜ κ°’μœΌλ‘œ λŒ€μž…ν•  수 있음

(일반 μ—°μ‚°μžμ— λŒ€ν•œ 기둝은 μƒλž΅ν•˜κ² μŠ΅λ‹ˆλ‹€.)

λΉ„νŠΈ μ—°μ‚°μž

λΉ„νŠΈ 논리 μ—°μ‚°μž

  • & : 두 개의 λΉ„νŠΈ 값이 λͺ¨λ‘ 1인 κ²½μš°μ—λ§Œ 1이 됨
  • | : ν•˜λ‚˜μ˜ λΉ„νŠΈλ§Œ 1이어도 1이 됨
  • ^ : 같은 값이면 0, λ‹€λ₯Έ 값이면 1
  • ~ : λΉ„νŠΈ 값이 0이면 1, 1이면 0으둜 λ°”κΏˆ

λΉ„νŠΈ 이동 μ—°μ‚°μž

  • << : μ™Όμͺ½μœΌλ‘œ λΉ„νŠΈ 이동. μ™Όμͺ½μœΌλ‘œ nλΉ„νŠΈ μ΄λ™ν•˜λ©΄ κΈ°μ‘΄ 값에 2의 n제곱만큼 곱함
  • >> : 였λ₯Έμͺ½μœΌλ‘œ λΉ„νŠΈ 이동. 였λ₯Έμͺ½μœΌλ‘œ nλΉ„νŠΈ μ΄λ™ν•˜λ©΄ κΈ°μ‘΄ 값을 2의 n제곱만큼 λ‚˜λˆ”
  • >>> : 였λ₯Έμͺ½μœΌλ‘œ λΉ„νŠΈ 이동, μ™Όμͺ½μ— μ±„μ›Œμ§€λŠ” λΉ„νŠΈ 값이 λΆ€ν˜Έ λΉ„νŠΈμ™€ 상관없이 무쑰건 0이 됨

(μ œμ–΄λ¬Έκ³Ό λ°˜λ³΅λ¬Έμ— λŒ€ν•œ 기둝은 μƒλž΅ν•˜κ² μŠ΅λ‹ˆλ‹€.)


객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°

  • 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°(Object-Oriented Programming; OOP)은 객체λ₯Ό 기반으둜 ν”„λ‘œκ·Έλž˜λ° ν•˜λŠ” 것
  • ν•œ λ§ˆλ””λ‘œ, 객체λ₯Ό λ§Œλ“€κ³  객체 사이에 μΌμ–΄λ‚˜λŠ” 일을 κ΅¬ν˜„ν•˜λŠ” 것
  • μš°λ¦¬λŠ” 객체λ₯Ό λ¨Όμ € μ •μ˜ν•˜κ³  각 객체가 μ–΄λ–€ κΈ°λŠ₯을 μ œκ³΅ν• μ§€, 객체 κ°„ ν˜‘λ ₯을 μ–΄λ–»κ²Œ κ΅¬ν˜„ν•  것인지 κ³ λ―Όν•΄μ•Ό 함

클래슀

  • ν΄λž˜μŠ€λŠ” 객체의 속성과 κΈ°λŠ₯을 μ½”λ“œλ‘œ κ΅¬ν˜„ν•œ 것
  • ν΄λž˜μŠ€λŠ” 속성(멀버 λ³€μˆ˜)κ³Ό λ©”μ„œλ“œλ₯Ό 가짐
  • 클래슀 이름은 λŒ€λ¬Έμžλ‘œ μ‹œμž‘ν•¨ (coding convention)

μ•„λž˜λŠ” 클래슀λ₯Ό μ •μ˜ν•˜λŠ” 문법이닀.

(μ ‘κ·Ό μ œμ–΄μž) class 클래슀 이름 {
  멀버 λ³€μˆ˜;
  λ©”μ„œλ“œ;
}

멀버 λ³€μˆ˜ (member variable)

  • 객체가 κ°€μ§€λŠ” 속성을 클래슀 내뢀에 λ³€μˆ˜λ‘œ μ„ μ–Έν•œ 것
  • 멀버 λ³€μˆ˜(member variable)λŠ” λ‹€λ₯Έ 말둜 속성(property) λ˜λŠ” νŠΉμ„±(attribute) λ“±μœΌλ‘œ ν‘œν˜„ν•¨
  • 멀버 λ³€μˆ˜μ˜ μžλ£Œν˜•μ€ κΈ°λ³Έ μžλ£Œν˜•(int, double ..), μ°Έμ‘° μžλ£Œν˜•(String, Date, 직접 λ§Œλ“  클래슀 ..) λ‘˜ λ‹€ κ°€λŠ₯ν•˜λ‹€.

μ°Έκ³ ) νŒ¨ν‚€μ§€λŠ” 클래슀 파일의 λ¬ΆμŒμ΄λ‹€. νŒ¨ν‚€μ§€λŠ” 계측 ꡬ쑰λ₯Ό 가지고, 이 계측 ꡬ쑰λ₯Ό 잘 ꡬ성해야 μœ μ§€ λ³΄μˆ˜κ°€ νŽΈλ¦¬ν•˜λ‹€.

λ©”μ„œλ“œ (method)

  • λ©”μ„œλ“œλŠ” ν•¨μˆ˜μ— 객체 지ν–₯ κ°œλ…μ΄ ν¬ν•¨λœ μš©μ–΄
  • 멀버 λ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ 클래슀의 κΈ°λŠ₯을 κ΅¬ν˜„ν•œ 것
  • 객체의 κΈ°λŠ₯을 κ΅¬ν˜„ν•˜κΈ° μœ„ν•΄ 클래슀 내뢀에 κ΅¬ν˜„λ˜λŠ” ν•¨μˆ˜
  • 멀버 ν•¨μˆ˜(member function)라고도 함
  • λ©”μ„œλ“œμ˜ 이름은 κ·Έ 객체λ₯Ό μ‚¬μš©ν•˜λŠ” 객체(ν΄λΌμ΄μ–ΈνŠΈ)에 맞게 μ§“λŠ” 것이 μ’‹μŒ

μ•„λž˜λŠ” ν΄λž˜μŠ€μ™€ λ‚΄λΆ€μ˜ 멀버 λ³€μˆ˜, λ©”μ„œλ“œλ₯Ό κ΅¬ν˜„ν•œ μ½”λ“œμ΄λ‹€.

public class Student {
    int studentID;
    String studentName;
    int grade;
    String address;

    public String getStudentName() {
        return studentName;
    }

    public void setStudentName(String name) {
        studentName = name;
    }
}

main() ν•¨μˆ˜

  • 클래슀λ₯Ό μ‚¬μš©ν•˜λ €λ©΄ main() ν•¨μˆ˜κ°€ μžˆμ–΄μ•Ό 함. 이 main() ν•¨μˆ˜λŠ” 클래슀 내뢀에 λ§Œλ“€μ§€λ§Œ, 클래슀의 λ©”μ„œλ“œλŠ” μ•„λ‹˜
  • μžλ°” 가상 λ¨Έμ‹ (JVM)은 ν”„λ‘œκ·Έλž¨μ„ μ‹œμž‘ν•  λ•Œ main() ν•¨μˆ˜λ₯Ό κ°€μž₯ λ¨Όμ € ν˜ΈμΆœν•¨
  • main() ν•¨μˆ˜λŠ” 클래슀 내뢀에 λ§Œλ“€μ–΄λ„ 되고, 외뢀에 ν…ŒμŠ€νŠΈμš© 클래슀λ₯Ό λ§Œλ“€μ–΄ μ‚¬μš©ν•΄λ„ 됨
  • ν…ŒμŠ€νŠΈ ν΄λž˜μŠ€μ™€ μ‹€μ œ 클래슀 파일이 각각 λ‹€λ₯Έ νŒ¨ν‚€μ§€μ— μžˆμ„ 경우 import문을 μ‚¬μš©ν•΄ 클래슀λ₯Ό λΆˆλŸ¬μ™€μ•Ό 함.

μΈμŠ€ν„΄μŠ€ (instance)

  • main() ν•¨μˆ˜μ—μ„œ 클래슀λ₯Ό μ‚¬μš©ν•  λ•Œ new μ˜ˆμ•½μ–΄μ™€ μƒμ„±μžλ₯Ό μ‚¬μš©ν•΄ 클래슀λ₯Ό 생성
  • ν΄λž˜μŠ€κ°€ μƒμ„±λœλ‹€λŠ” 것은 클래슀λ₯Ό μ‹€μ œ μ‚¬μš©ν•  수 μžˆλ„λ‘ νž™ λ©”λͺ¨λ¦¬λ₯Ό ν• λ‹Ή λ°›λŠ” κ²ƒμž„
  • μƒμ„±λœ 클래슀λ₯Ό μΈμŠ€ν„΄μŠ€(ν˜Ήμ€ 객체)라고 ν•˜κ³ , μΈμŠ€ν„΄μŠ€λ₯Ό κ°€λ¦¬ν‚€λŠ” ν΄λž˜μŠ€ν˜• λ³€μˆ˜λ₯Ό μ°Έμ‘° λ³€μˆ˜λΌκ³  함
  • 즉, μΈμŠ€ν„΄μŠ€λŠ” ν΄λž˜μŠ€κ°€ λ©”λͺ¨λ¦¬ 곡간에 μƒμ„±λœ μƒνƒœ

μ•„λž˜λŠ” new μ˜ˆμ•½μ–΄λ₯Ό μ‚¬μš©ν•˜λŠ” 방법이닀.

ν΄λž˜μŠ€ν˜• λ³€μˆ˜λͺ… = new μƒμ„±μž;
  • μ°Έμ‘° λ³€μˆ˜μ— λ„νŠΈ μ—°μ‚°μž(.)λ₯Ό μ‚¬μš©ν•˜μ—¬ 멀버 λ³€μˆ˜μ™€ λ©”μ„œλ“œλ₯Ό μ°Έμ‘°ν•˜μ—¬ μ‚¬μš© κ°€λŠ₯
  • new Student()와 같이 μ„ μ–Έν•˜λ©΄ 이 μΈμŠ€ν„΄μŠ€μ™€ 멀버 λ³€μˆ˜λ“€μ€ νž™ λ©”λͺ¨λ¦¬(heap memory)에 μ €μž₯

μ•„λž˜λŠ” μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜λŠ” μ½”λ“œμ΄λ‹€.

Student studentAhn = new Student();

지역 λ³€μˆ˜ Ahn에 μƒμ„±λœ μΈμŠ€ν„΄μŠ€λ₯Ό λŒ€μž…ν•œλ‹€λŠ” 것은, studentAhn에 μΈμŠ€ν„΄μŠ€κ°€ μƒμ„±λœ νž™ λ©”λͺ¨λ¦¬μ˜ μ£Όμ†Œλ₯Ό λŒ€μž…ν•œλ‹€λŠ” 것과 같은 μ˜λ―Έμ΄λ‹€.

μ°Έκ³ ) νž™(heap)은 ν”„λ‘œκ·Έλž¨μ—μ„œ μ‚¬μš©ν•˜λŠ” 동적 λ©”λͺ¨λ¦¬(dynamic memory)곡간이닀. 보톡 객체가 생성될 λ•Œ μ‚¬μš©ν•˜λŠ” 곡간이닀.

μƒμ„±μž (basic.constructor)

  • μƒμ„±μžλŠ” 클래슀λ₯Ό 처음 λ§Œλ“€ λ•Œ 멀버 λ³€μˆ˜λ‚˜ μƒμˆ˜λ₯Ό μ΄ˆκΈ°ν™”ν•΄μ€Œ
  • μƒμ„±μžκ°€ μ—†λŠ” ν΄λž˜μŠ€λŠ” μžλ°” μ»΄νŒŒμΌλŸ¬μ—μ„œ λ””ν΄νŠΈ μƒμ„±μž(default basic.constructor)λ₯Ό μžλ™μœΌλ‘œ λ§Œλ“¦
  • ν”„λ‘œκ·Έλž˜λ¨Έκ°€ λ””ν΄νŠΈ μƒμ„±μžλ₯Ό 직접 λ§Œλ“œλŠ” 경우 ν•„μš”μ— 따라 μ½”λ“œ κ΅¬ν˜„ κ°€λŠ₯
  • μΈμŠ€ν„΄μŠ€κ°€ 생성될 λ•Œ μΈμŠ€ν„΄μŠ€ μ΄ˆκΈ°ν™”λ₯Ό μœ„ν•΄ μƒμ„±μžλ₯Ό 직접 κ΅¬ν˜„ν•˜κΈ°λ„ 함

μ•„λž˜λŠ” 클래슀 μ•ˆμ˜ λ””ν΄νŠΈ μƒμ„±μžλ₯Ό μ½”λ“œλ‘œ κ΅¬ν˜„ν•œ 것이닀.

public class Person {
  String name;
  float height;
  float weight;
  
  public Person() {}
}

μƒμ„±μž μ˜€λ²„λ‘œλ“œ (basic.constructor overload)

  • μƒμ„±μž μ˜€λ²„λ‘œλ“œλŠ” ν΄λž˜μŠ€μ— μƒμ„±μžκ°€ 두 개 이상 μ œκ³΅λ˜λŠ” 것
  • ν•„μš”μ— 따라 λ§€κ°œλ³€μˆ˜κ°€ λ‹€λ₯Έ μƒμ„±μžλ₯Ό μ—¬λŸ¬ 개 λ§Œλ“€ 수 있음
  • κ²½μš°μ— 따라 ν΄λž˜μŠ€μ—μ„œ μΌλΆ€λŸ¬ λ””ν΄νŠΈ μƒμ„±μžλ₯Ό μ œκ³΅ν•˜μ§€ μ•ŠκΈ°λ„ 함

μ°Έκ³ ) 객체 지ν–₯ ν”„λ‘œκ·Έλž¨μ—μ„œ λ©”μ„œλ“œ 이름은 κ°™κ³  λ§€κ°œλ³€μˆ˜λ§Œ λ‹€λ₯Έ 경우λ₯Ό μ˜€λ²„λ‘œλ“œλΌκ³  ν•œλ‹€.

μ•„λž˜λŠ” μƒμ„±μž μ˜€λ²„λ‘œλ“œλ₯Ό κ΅¬ν˜„ν•œ μ½”λ“œμ΄λ‹€.

public class Person {
    String name;
    float height;
    float weight;

    public Person() {}

    public Person(String pname) {
        name = pname;
    }

    public Person(String pname, float pheight, float pweight) {
        name = pname;
        height = pheight;
        weight = pweight;
    }
}

정보 은닉 (information basic.hiding)

  • 객체 지ν–₯ ν”„λ‘œκ·Έλž¨μ—μ„œλŠ” μ ‘κ·Ό μ œμ–΄μž(access modifier)λ₯Ό μ‚¬μš©ν•΄ (클래슀 λ‚΄λΆ€ λ³€μˆ˜, λ©”μ„œλ“œ, μƒμ„±μžμ— λŒ€ν•œ) μ ‘κ·Ό κΆŒν•œμ„ 지정할 수 있음
  • private으둜 μ„ μ–Έν•œ 멀버 λ³€μˆ˜λŠ” getter, setter λ©”μ„œλ“œ(public으둜 μ„€μ •)둜 μ ‘κ·Ό κ°€λŠ₯
  • 정보 은닉은 클래슀 λ‚΄λΆ€μ—μ„œ μ‚¬μš©ν•  λ³€μˆ˜λ‚˜ λ©”μ„œλ“œλ₯Ό private으둜 μ„ μ–Έν•˜μ—¬ μ™ΈλΆ€μ—μ„œ 직접 μ ‘κ·Όν•˜μ§€ λͺ»ν•˜λ„둝 ν•˜λŠ” 것
  • 정보 은닉은 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ˜ νŠΉμ§•
μ ‘κ·Ό μ œμ–΄μž μ„€λͺ…
public μ™ΈλΆ€ 클래슀 μ–΄λ””μ„œλ‚˜ μ ‘κ·Ό κ°€λŠ₯
protected 같은 νŒ¨ν‚€μ§€ 내뢀와 상속 κ΄€κ³„μ˜ ν΄λž˜μŠ€μ—μ„œλ§Œ μ ‘κ·Ό κ°€λŠ₯
아무것도 μ—†λŠ” 경우 default이며 같은 νŒ¨ν‚€μ§€ λ‚΄λΆ€μ—μ„œλ§Œ μ ‘κ·Ό κ°€λŠ₯
private 같은 클래슀 λ‚΄λΆ€μ—μ„œλ§Œ μ ‘κ·Ό κ°€λŠ₯

this μ˜ˆμ•½μ–΄

  • thisλŠ” μƒμ„±λœ μΈμŠ€ν„΄μŠ€ 슀슀둜λ₯Ό κ°€λ¦¬ν‚€λŠ” μ˜ˆμ•½μ–΄
  • thisλŠ” 동적 λ©”λͺ¨λ¦¬μ— μƒμ„±λœ μΈμŠ€ν„΄μŠ€μ˜ μœ„μΉ˜λ₯Ό 직접 가리킴
  • λ˜ν•œ thisλŠ” μƒμ„±μžμ—μ„œ λ‹€λ₯Έ μƒμ„±μžλ₯Ό ν˜ΈμΆœν•  수 있음 (μ΄λ•Œ 호좜 μ½”λ“œ 이전에 λ‹€λ₯Έ μ½”λ“œλ₯Ό λ„£μœΌλ©΄ 였λ₯˜ λ°œμƒ)
  • thisλ₯Ό ν™œμš©ν•΄ μƒμ„±λœ 클래슀 μžμ‹ μ˜ μ£Όμ†Œκ°’μ„ λ°˜ν™˜ν•  수 있음

static λ³€μˆ˜

  • static λ³€μˆ˜λŠ” 정적 λ³€μˆ˜ ν˜Ήμ€ 클래슀 λ³€μˆ˜(class variable)라고도 함
  • static λ³€μˆ˜λŠ” ν΄λž˜μŠ€μ—μ„œ κ³΅ν†΅μœΌλ‘œ μ‚¬μš©ν•˜λŠ” λ³€μˆ˜, 즉 ν”„λ‘œκ·Έλž¨μ΄ μ‹€ν–‰λ˜μ–΄ λ©”λͺ¨λ¦¬μ— μ˜¬λΌκ°”μ„ λ•Œ ν•œ 번 λ©”λͺ¨λ¦¬ 곡간이 ν• λ‹Ήλ˜κ³ , κ·Έ ν›„ λͺ¨λ“  μΈμŠ€ν„΄μŠ€κ°€ κ³΅μœ ν•˜λŠ” λ³€μˆ˜
  • μžλ°”μ—μ„œλŠ” λ‹€λ₯Έ 멀버 λ³€μˆ˜μ²˜λŸΌ 클래슀 내뢀에, static μ˜ˆμ•½μ–΄λ₯Ό μ‚¬μš©ν•˜μ—¬ μ„ μ–Έ

μ•„λž˜λŠ” static의 μ‚¬μš©λ²•μ΄λ‹€.

static μžλ£Œν˜• λ³€μˆ˜λͺ…;

μ•„λž˜μ²˜λŸΌ class μ•ˆμ— static μ˜ˆμ•½μ–΄λ₯Ό μ‚¬μš©ν•˜μ—¬ μ„ μ–Έν•œλ‹€.

public class Student {
    public static int serialNum = 1000;
    public int studentID;
    public String studentName;
}
  • static λ³€μˆ˜λŠ” μΈμŠ€ν„΄μŠ€ μƒμ„±κ³ΌλŠ” λ³„κ°œμ΄λ―€λ‘œ μΈμŠ€ν„΄μŠ€λ³΄λ‹€ λ¨Όμ € 생성
  • λ”°λΌμ„œ static λ³€μˆ˜λŠ” 클래슀 μ΄λ¦„μœΌλ‘œλ„ μ°Έμ‘°ν•˜μ—¬ μ‚¬μš© κ°€λŠ₯ (보톡 클래슀 이름과 ν•¨κ»˜ μ‚¬μš©)
  • static λ³€μˆ˜λ₯Ό μœ„ν•œ λ©”μ„œλ“œλ₯Ό static λ©”μ„œλ“œ λ˜λŠ” 클래슀 λ©”μ„œλ“œ(class method)라고 함
  • static λ©”μ„œλ“œ λ˜ν•œ static λ³€μˆ˜μ²˜λŸΌ 클래슀 μ΄λ¦„μœΌλ‘œ 직접 호좜 κ°€λŠ₯

μ•„λž˜λŠ” static λ©”μ„œλ“œλ₯Ό κ΅¬ν˜„ν•œ μ½”λ“œμ΄λ‹€.

public class Student2 {
    private static int serialNum = 1000;
    int studentID;
    String studentName;
    int grade;
    String address;

    public Student2() {
        serialNum++;
        studentID = serialNum;
    }

    public static int getSerialNum() {
        int i = 10;
        return serialNum;
    }

    public static void setSerialNum(int serialNum) {
        Student2.serialNum = serialNum;
    }
}
  • static λ©”μ„œλ“œ λ‚΄μ—μ„œ 지역 λ³€μˆ˜μ™€ 클래슀 λ³€μˆ˜λŠ” μ‚¬μš©ν•  수 μžˆμ§€λ§Œ, μΈμŠ€ν„΄μŠ€ λ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜λ©΄ 였λ₯˜κ°€ λ°œμƒν•¨

λ³€μˆ˜ 유효 λ²”μœ„ (scope)

  • λ³€μˆ˜λŠ” νŠΉμ„±μ— 맞게 μ„ μ–Έν•΄μ„œ μ‚¬μš©ν•˜λŠ” 것이 μ€‘μš”ν•¨
  • 지역 λ³€μˆ˜(local variable) : ν•¨μˆ˜/λ©”μ„œλ“œ λ‚΄λΆ€μ—μ„œ μ„ μ–Έν•˜κΈ° λ•Œλ¬Έμ— ν•¨μˆ˜ λ°–μ—μ„œλŠ” μ‚¬μš© λΆˆκ°€
  • 멀버 λ³€μˆ˜(member variable) : 클래슀의 μ–΄λŠ λ©”μ„œλ“œμ—μ„œλ‚˜ μ‚¬μš© κ°€λŠ₯
  • static λ³€μˆ˜ : private이 μ•„λ‹ˆλΌλ©΄ 클래슀 μ™ΈλΆ€μ—μ„œλ„ 객체 생성과 λ¬΄κ΄€ν•˜κ²Œ μ‚¬μš© κ°€λŠ₯
λ³€μˆ˜ μœ ν˜• μ„ μ–Έ μœ„μΉ˜ μ‚¬μš© λ²”μœ„ λ©”λͺ¨λ¦¬ 생성과 μ†Œλ©Έ
지역 λ³€μˆ˜ ν•¨μˆ˜ 내뢀에 μ„ μ–Έ ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œλ§Œ μ‚¬μš© μŠ€νƒ ν•¨μˆ˜κ°€ 호좜될 λ•Œ μƒμ„±λ˜κ³  ν•¨μˆ˜κ°€ λλ‚˜λ©΄ μ†Œλ©Έ
멀버 λ³€μˆ˜ 클래슀 멀버 λ³€μˆ˜λ‘œ μ„ μ–Έ 클래슀 λ‚΄λΆ€μ—μ„œ μ‚¬μš©, private이 μ•„λ‹ˆλ©΄ λ‹€λ₯Έ ν΄λž˜μŠ€μ—μ„œ μ ‘κ·Ό κ°€λŠ₯ νž™ μΈμŠ€ν„΄μŠ€κ°€ 생성될 λ•Œ νž™μ— 생성, 가비지 컬렉터가 λ©”λͺ¨λ¦¬ 수거 μ‹œ μ†Œλ©Έ
static λ³€μˆ˜ static μ˜ˆμ•½μ–΄λ₯Ό μ‚¬μš©ν•˜μ—¬ 클래슀 내뢀에 μ„ μ–Έ 클래슀 λ‚΄λΆ€μ—μ„œ μ‚¬μš©, private이 μ•„λ‹ˆλ©΄ 클래슀 μ΄λ¦„μœΌλ‘œ λ‹€λ₯Έ ν΄λž˜μŠ€μ—μ„œ μ‚¬μš© κ°€λŠ₯ 데이터 μ˜μ—­ ν”„λ‘œκ·Έλž¨ μ‹œμž‘ μ‹œ 데이터 μ˜μ—­μ— 생성, ν”„λ‘œκ·Έλž¨ μ’…λ£Œμ™€ λ©”λͺ¨λ¦¬ ν•΄μ œ μ‹œ μ†Œλ©Έ
  • static λ³€μˆ˜λŠ” ν”„λ‘œκ·Έλž¨ μ‹œμž‘λΆ€ν„° λκΉŒμ§€ λ©”λͺ¨λ¦¬μ— μƒμ£Όν•˜λ―€λ‘œ, 크기가 λ„ˆλ¬΄ 큰 λ³€μˆ˜λ₯Ό static으둜 μ„ μ–Έν•˜λŠ” 것은 쒋지 μ•ŠμŒ
  • 지역 λ³€μˆ˜ -> ν•¨μˆ˜μ—μ„œ κΈ°λŠ₯ κ΅¬ν˜„μ„ μœ„ν•΄ μž μ‹œ μ‚¬μš©ν•  λ•Œ
  • 멀버 λ³€μˆ˜ -> 클래슀의 속성을 λ‚˜νƒ€λ‚΄κ³ , 각 μΈμŠ€ν„΄μŠ€λ§ˆλ‹€ λ‹€λ₯Έ 값을 κ°€μ§ˆ λ•Œ
  • static λ³€μˆ˜ -> μ—¬λŸ¬ μΈμŠ€ν„΄μŠ€μ—μ„œ κ³΅μœ ν•΄μ„œ μ‚¬μš©, ν•œ 번만 생성

싱글톀 νŒ¨ν„΄ (basic.singleton pattern)

  • 싱글톀 νŒ¨ν„΄μ€ 객체 지ν–₯ ν”„λ‘œκ·Έλž¨μ—μ„œ μΈμŠ€ν„΄μŠ€λ₯Ό 단 ν•˜λ‚˜λ§Œ μƒμ„±ν•˜λŠ” λ””μžμΈ νŒ¨ν„΄
  • 싀무 ν˜Ήμ€ μ—¬λŸ¬ ν”„λ ˆμž„μ›Œν¬μ—μ„œ 많이 μ‚¬μš©ν•˜λŠ” νŒ¨ν„΄

μ°Έκ³ ) λ””μžμΈ νŒ¨ν„΄(design pattern)μ΄λž€ 객체 지ν–₯ ν”„λ‘œκ·Έλž¨μ„ μ–΄λ–»κ²Œ κ΅¬ν˜„ν•΄μ•Ό 더 μœ μ—°ν•˜κ³  μž¬ν™œμš©μ„±μ΄ 높은 ν”„λ‘œκ·Έλž¨μ„ λ§Œλ“€ 수 μžˆλŠ”μ§€ μ •λ¦¬ν•œ λ‚΄μš©μ΄λ‹€. λ‹€μ‹œ 말해, ν”„λ‘œκ·Έλž¨ νŠΉμ„±μ— λ”°λ₯Έ 섀계 μœ ν˜•μ„ μ΄λ‘ ν™”ν•œ 것이닀.

1단계 : μƒμ„±μžλ₯Ό private으둜 λ§Œλ“€κΈ°

  • private으둜 λ””ν΄νŠΈ μƒμ„±μžλ₯Ό λͺ…μ‹œν•˜μ—¬, μ™ΈλΆ€ ν΄λž˜μŠ€μ—μ„œ λ§ˆμŒλŒ€λ‘œ μΈμŠ€ν„΄μŠ€λ₯Ό μ—¬λŸ¬ 개 μƒμ„±ν•˜λŠ” 것을 막기 μœ„ν•΄
  • 클래슀 λ‚΄λΆ€μ—μ„œλ§Œ ν•΄λ‹Ή 클래슀의 생성을 μ œμ–΄ν•  수 있음
public class Company {
    private Company() {}
}

2단계 : 클래슀 내뢀에 static으둜 μœ μΌν•œ μΈμŠ€ν„΄μŠ€ 생성

  • 이 μΈμŠ€ν„΄μŠ€κ°€ ν”„λ‘œκ·Έλž¨ μ „μ²΄μ—μ„œ μ‚¬μš©ν•  μœ μΌν•œ μΈμŠ€ν„΄μŠ€
  • μœ μΌν•œ μΈμŠ€ν„΄μŠ€λ₯Ό private으둜 μ„ μ–Έν•˜μ—¬ μΈμŠ€ν„΄μŠ€ 였λ₯˜ 방지
public class Company {
    private static Company instance = new Company();
    private Company() {}
}

3단계 : μ™ΈλΆ€μ—μ„œ μ°Έμ‘° κ°€λŠ₯ν•œ public λ©”μ„œλ“œ λ§Œλ“€κΈ°

  • μ™ΈλΆ€ μ‚¬μš©μ΄ κ°€λŠ₯ν•˜λ„λ‘, μœ μΌν•˜κ²Œ μƒμ„±ν•œ μΈμŠ€ν„΄μŠ€λ₯Ό λ°˜ν™˜ν•˜λŠ” public λ©”μ„œλ“œ 생성
  • μ΄λ•Œ μΈμŠ€ν„΄μŠ€ 생성과 상관없이 ν˜ΈμΆœν•  수 μžˆμ–΄μ•Ό ν•˜κΈ° λ•Œλ¬Έμ—, μΈμŠ€ν„΄μŠ€ λ°˜ν™˜ν•˜λŠ” λ©”μ„œλ“œλŠ” λ°˜λ“œμ‹œ static으둜 μ„ μ–Έ
public class Company {
    private static Company instance = new Company();
    private Company() {}
    
    public static Company getInstance() {
        if(instance == null) {
            instance = new Company();
        }
        return instance;
    }
}

4단계 : 클래슀λ₯Ό μ‹€μ œ μ‚¬μš©ν•˜λŠ” μ½”λ“œ λ§Œλ“€κΈ°

  • μ™ΈλΆ€ ν΄λž˜μŠ€μ—μ„œλŠ” 객체λ₯Ό 생성할 수 μ—†μœΌλ―€λ‘œ, static으둜 μ œκ³΅λ˜λŠ” getInstance() λ©”μ„œλ“œλ₯Ό 호좜
public class CompanyTest {
    public static void main(String[] args) {
        Company myCompany1 = Company.getInstance();
        Company myCompany2 = Company.getInstance();
        System.out.println(myCompany1 == myCompany2);
    }
}

λ°°μ—΄

  • 배열을 μ‚¬μš©ν•˜λ©΄ μžλ£Œν˜•μ΄ 같은 자료 μ—¬λŸ¬ 개λ₯Ό ν•œ λ²ˆμ— 관리 κ°€λŠ₯
  • λ°°μ—΄ μš”μ†Œλ“€μ€ μžλ£Œν˜•μ΄ λͺ¨λ‘ κ°™λ‹€.

μ•„λž˜λŠ” λ°°μ—΄μ˜ μ„ μ–Έ 방법이닀.

μžλ£Œν˜•[] 배열이름 = new μžλ£Œν˜•[개수];
μžλ£Œν˜• 배열이름[] = new μžλ£Œν˜•[개수];
  • 기본적으둜 λ°°μ—΄μ˜ μžλ£Œν˜•μ— 따라 μ •μˆ˜λŠ” 0, μ‹€μˆ˜λŠ” 0.0, 객체 배열은 null둜 μ΄ˆκΈ°ν™”λ¨
  • 배열을 νŠΉμ •ν•œ κ°’μœΌλ‘œ μ΄ˆκΈ°ν™”ν•  μˆ˜λ„ 있음
  • νŠΉμ •ν•œ κ°’μœΌλ‘œ μ΄ˆκΈ°ν™”ν•˜λŠ” 경우 []μ•ˆμ˜ κ°œμˆ˜λŠ” μƒλž΅ν•΄μ•Ό 함
  • μ„ μ–Έκ³Ό λ™μ‹œμ— μ΄ˆκΈ°ν™”ν•  λ•Œ new μžλ£Œν˜•[]λΆ€λΆ„ μƒλž΅ κ°€λŠ₯ (μ„ μ–Έ ν›„ μ΄ˆκΈ°ν™”ν•  λ•ŒλŠ” μƒλž΅ν•  수 μ—†μŒ)

μ•„λž˜λŠ” 배열을 μ„ μ–Έν•˜κ³  νŠΉμ •ν•œ κ°’μœΌλ‘œ μ΄ˆκΈ°ν™”ν•œ μ½”λ“œμ΄λ‹€.

int[] studentIDs = new int[] {101, 102, 103};
int[] studentIDs = {101, 102, 103};
  • 배열은 λ°°μ—΄ 총 길이λ₯Ό λ‚˜νƒ€λ‚΄λŠ” length 속성을 가짐

μ•„λž˜λŠ” 배열을 μ‚¬μš©ν•˜κ³  좜λ ₯ν•œ μ½”λ“œμ΄λ‹€.

public class ArrayTest {
    public static void main(String[] args) {
        int[] num = new int[] {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
        
        for(int i = 0; i < num.length; i++) {
            System.out.println(num[i]);
        }
    }
}
  • 객체 배열을 μ„ μ–Έν•˜κ²Œ 되면, 각각의 μΈμŠ€ν„΄μŠ€ μ£Όμ†Œ 값을 담을 곡간이 생성됨
  • 즉, Bookμ΄λΌλŠ” ν΄λž˜μŠ€κ°€ μžˆλ‹€κ³  κ°€μ •ν•  λ•Œ Book[] library = new Book[5];의 5개 κ³΅κ°„μ—λŠ” 각각 Book 객체의 μ£Όμ†Œκ°’μ„ 담을 수 있음
  • μ•„λž˜ μ½”λ“œμ²˜λŸΌ 객체 λ°°μ—΄ μ„ μ–Έ 후에 new ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ μƒμ„±λœ 객체λ₯Ό 직접 μ €μž₯ν•΄μ•Ό 함
public class BookArray {
    public static void main(String[] args) {
        Book[] library = new Book[5];

        library[0] = new Book("νƒœλ°±μ‚°λ§₯", "μ‘°μ •λž˜");
        library[1] = new Book("λ°λ―Έμ•ˆ", "ν—€λ₯΄λ§Œ ν—€μ„Έ");
        library[2] = new Book("μ–΄λ–»κ²Œ μ‚΄ 것인가", "μœ μ‹œλ―Ό");
        library[3] = new Book("토지", "박경리");
        library[4] = new Book("μ–΄λ¦° μ™•μž", "생텍μ₯νŽ˜λ¦¬");

        for(int i = 0; i < library.length; i++) {
            library[i].showBookInfo();
        }

        for(int i = 0; i < library.length; i++) {
            System.out.println(library[i]);
        }
    }
}
  • λ°°μ—΄ λ³΅μ‚¬λŠ” κΈ°μ‘΄ λ°°μ—΄κ³Ό μžλ£Œν˜•, λ°°μ—΄ 크기가 같은 배열을 μƒˆλ‘œ λ§Œλ“€κ±°λ‚˜ 더 큰 배열을 λ§Œλ“€μ–΄ κΈ°μ‘΄ λ°°μ—΄ 자료λ₯Ό 뢈러올 λ•Œ μ‚¬μš©
  • λ°°μ—΄ λ³΅μ‚¬μ˜ κ°€μž₯ λ‹¨μˆœν•œ 방법은 for문을 ν™œμš©ν•œ λ³΅μ‚¬μž„
  • λ‹€λ₯Έ 방법은 System.arraycopy()λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜λŠ” 방법
  • System.arraycopy(src, srcPos, dest, destPos, length)λ©”μ„œλ“œμ˜ 각 λ§€κ°œλ³€μˆ˜ μ„€λͺ…은 μ•„λž˜μ™€ κ°™μŒ
  • 볡사할 λŒ€μƒ λ°°μ—΄μ˜ 길이가 볡사할 μš”μ†Œ κ°œμˆ˜λ³΄λ‹€ μž‘λ‹€λ©΄ 였λ₯˜ λ°œμƒ
λ§€κ°œλ³€μˆ˜ μ„€λͺ…
src 볡사할 λ°°μ—΄ 이름
srcPos 볡사할 λ°°μ—΄μ˜ 첫 번째 μœ„μΉ˜
dest λ³΅μ‚¬ν•΄μ„œ λΆ™μ—¬ 넣을 λŒ€μƒ λ°°μ—΄ 이름
destPos λ³΅μ‚¬ν•΄μ„œ λŒ€μƒ 배열에 뢙여넣을 첫 번째 μœ„μΉ˜
length srcμ—μ„œ dest둜 볡사할 μš”μ†Œ 개수
  • 객체 λ°°μ—΄μ˜ μš”μ†Œμ— μ €μž₯된 값은 μΈμŠ€ν„΄μŠ€ μžμ²΄κ°€ μ•„λ‹ˆλΌ μΈμŠ€ν„΄μŠ€ μ£Όμ†Œκ°’
  • λ”°λΌμ„œ 객체 λ°°μ—΄ 볡사 μ‹œ λ°°μ—΄ μΈμŠ€ν„΄μŠ€ κ°’ λ³€κ²½λ˜λ©΄ 두 λ°°μ—΄ λͺ¨λ‘ 영ν–₯ λ°›μŒ
  • 이λ₯Ό 얕은 볡사(shallow copy)라고 함
  • λ°˜λŒ€λ‘œ, μΈμŠ€ν„΄μŠ€λ₯Ό λ”°λ‘œ κ΄€λ¦¬ν•˜κ³  μ‹ΆμœΌλ©΄ 직접 μΈμŠ€ν„΄μŠ€λ₯Ό λ§Œλ“€κ³  κ·Έ 값을 볡사해야 함
  • 이λ₯Ό κΉŠμ€ 볡사(deep copy)라고 함

닀차원 λ°°μ—΄

  • μœ„μ˜ 배열은 λͺ¨λ‘ '일차원 λ°°μ—΄'에 λŒ€ν•œ μ„€λͺ…μž„
  • 이차원 μ΄μƒμœΌλ‘œ κ΅¬ν˜„ν•œ 배열을 닀차원 배열이라고 함
  • 닀차원 배열은 ν‰λ©΄μ΄λ‚˜ 곡간 κ°œλ… κ΅¬ν˜„μ— μ‚¬μš©

ν–₯μƒλœ forλ¬Έ (enhanced for loop)

  • λ°°μ—΄μ˜ μ²˜μŒμ— λκΉŒμ§€ λͺ¨λ“  μš”μ†Œλ₯Ό μ°Έμ‘°ν•  λ•Œ μ‚¬μš©ν•˜λ©΄ 편리
  • λ°°μ—΄ μš”μ†Œ 값을 μˆœμ„œλŒ€λ‘œ 가져와 ν•˜λ‚˜μ”© λ³€μˆ˜μ— λŒ€μž…
  • λͺ¨λ“  λ°°μ—΄μ˜ μ‹œμž‘ μš”μ†ŒλΆ€ν„° 끝 μš”μ†ŒκΉŒμ§€ μ‹€ν–‰

μ•„λž˜μ²˜λŸΌ μ‚¬μš©ν•  수 μžˆλ‹€.

for(μžλ£Œν˜• λ³€μˆ˜ : λ°°μ—΄) {
  반볡 μ‹€ν–‰λ¬Έ;
}

상속 (basic.inheritance)

  • 객체지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ˜ μ€‘μš” νŠΉμ§• 쀑 ν•˜λ‚˜
  • B ν΄λž˜μŠ€κ°€ A 클래슀λ₯Ό μƒμ†λ°›μœΌλ©΄, B ν΄λž˜μŠ€λŠ” A 클래슀의 멀버 λ³€μˆ˜μ™€ λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•  수 있음
  • 상속을 μ‚¬μš©ν•¨μœΌλ‘œμ¨ μœ μ§€λ³΄μˆ˜ν•˜κΈ° νŽΈν•˜κ³  ν”„λ‘œκ·Έλž¨ μˆ˜μ •/λ‚΄μš© μΆ”κ°€κ°€ μœ μ—°ν•¨
  • μƒμ†ν•˜λŠ” λΆ€λͺ¨ 클래슀(parent class)λŠ” 'μƒμœ„ 클래슀', μƒμ†λ°›λŠ” μžμ‹ 클래슀(child class)λŠ” 'ν•˜μœ„ 클래슀'라고 함
  • 상속 κ΄€κ³„μ—μ„œλŠ” ν•˜μœ„ ν΄λž˜μŠ€κ°€ μƒμœ„ ν΄λž˜μŠ€λ³΄λ‹€ ꡬ체적인 클래슀
  • μžλ°” λ¬Έλ²•μœΌλ‘œ 상속을 κ΅¬ν˜„ν•  λ•ŒλŠ” 'μ—°μž₯, ν™•μž₯ν•˜λ‹€'의 λœ»μ„ 가진 extends μ˜ˆμ•½μ–΄ μ‚¬μš©
  • ν•˜μœ„ ν΄λž˜μŠ€κ°€ 생성될 λ•Œ μƒμœ„ ν΄λž˜μŠ€κ°€ λ¨Όμ € 생성됨
  • super μ˜ˆμ•½μ–΄λ₯Ό μ‚¬μš©ν•˜μ—¬ μƒμœ„ ν΄λž˜μŠ€μ— μ ‘κ·Ό κ°€λŠ₯ (ν•˜μœ„ 클래슀 μƒμ„±μžμ—μ„œ super() μžλ™ 호좜)
  • 클래슀 λ³€κ²½ μ‹œ, ν•˜μœ„ ν΄λž˜μŠ€λŠ” μƒμœ„ 클래슀둜 λ¬΅μ‹œμ  ν˜•λ³€ν™˜λ¨ (이 경우 μƒμœ„ 클래슀의 λ³€μˆ˜μ™€ λ©”μ„œλ“œλ§Œ μ°Έμ‘° κ°€λŠ₯)
  • μžλ°”λŠ” 닀쀑 상속(ν•œ ν΄λž˜μŠ€κ°€ μ—¬λŸ¬ 클래슀λ₯Ό 상속)을 μ§€μ›ν•˜μ§€ μ•ŠμŒ (닀쀑 μƒμ†μœΌλ‘œ μΈν•œ λͺ¨ν˜Έμ„±μ„ μ—†μ• κΈ° μœ„ν•΄)

λ©”μ„œλ“œ μ˜€λ²„λΌμ΄λ”© (method overriding)

  • μƒμœ„ ν΄λž˜μŠ€μ— μ •μ˜ν•œ λ©”μ„œλ“œκ°€ ν•˜μœ„ ν΄λž˜μŠ€μ—μ„œμ˜ κ΅¬ν˜„κ³Ό λ§žμ§€ μ•Šμ„ λ•Œ, ν•˜μœ„ ν΄λž˜μŠ€μ—μ„œ λ©”μ„œλ“œλ₯Ό μž¬μ •μ˜ν•˜λŠ” 것
  • μ˜€λ²„λΌμ΄λ”© μ‹œ λ°˜ν™˜ν˜•, λ©”μ„œλ“œ 이름, λ§€κ°œλ³€μˆ˜ 개수, λ§€κ°œλ³€μˆ˜ μžλ£Œν˜•μ΄ κ°™μ•„μ•Ό 함
  • @Override μ• λ…Έν…Œμ΄μ…˜μ€ μž¬μ •μ˜λœ λ©”μ„œλ“œμž„μ„ μ»΄νŒŒμΌλŸ¬μ— λͺ…ν™•νžˆ μ•Œλ €μ€Œ

μ°Έκ³ ) μ• λ…Έν…Œμ΄μ…˜μ€ μ˜μ–΄λ‘œ μ£Όμ„μ΄λΌλŠ” 의미둜, @μ• λ…Έν…Œμ΄μ…˜μ΄λ¦„μœΌλ‘œ ν‘œν˜„ν•œλ‹€. μžλ°”μ—μ„œ μ œκ³΅ν•˜λŠ” μ• λ…Έν…Œμ΄μ…˜μ€ μ»΄νŒŒμΌλŸ¬μ—κ²Œ νŠΉμ •ν•œ 정보λ₯Ό μ œκ³΅ν•΄μ£ΌλŠ” 역할을 ν•œλ‹€. 미리 μ •μ˜λœ μ• λ…Έν…Œμ΄μ…˜μ„ ν‘œμ€€ μ• λ…Έν…Œμ΄μ…˜μ΄λΌκ³  ν•œλ‹€. μ•„λž˜λŠ” ν‘œμ€€ μ• λ…Έν…Œμ΄μ…˜μ˜ μ˜ˆμ‹œμ΄λ‹€.

μ• λ…Έν…Œμ΄μ…˜ μ„€λͺ…
@Override μž¬μ •μ˜λœ λ©”μ„œλ“œλΌλŠ” 정보 제곡
@FunctionalInterface ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λΌλŠ” 정보 제곡
@Deprecated 이후 λ²„μ „μ—μ„œ μ‚¬μš©λ˜μ§€ μ•Šμ„ 수 μžˆλŠ” λ³€μˆ˜, λ©”μ„œλ“œμ— μ‚¬μš©
@SuppressWarnings νŠΉμ • κ²½κ³ κ°€ λ‚˜νƒ€λ‚˜μ§€ μ•Šλ„λ‘ 함

가상 λ©”μ„œλ“œ (virtual method)

  • μžλ°”μ˜ λͺ¨λ“  λ©”μ„œλ“œλŠ” κ°€μƒλ©”μ„œλ“œμž„
  • 클래슀λ₯Ό μ‚¬μš©ν•˜μ—¬ μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜λ©΄ 멀버 λ³€μˆ˜λŠ” νž™ λ©”λͺ¨λ¦¬μ— μœ„μΉ˜ν•˜κ³ , λ©”μ„œλ“œλŠ” λ©”μ„œλ“œ μ˜μ—­μ— μœ„μΉ˜ν•¨
  • μΈμŠ€ν„΄μŠ€κ°€ 달라도 λ™μΌν•œ λ©”μ„œλ“œ 호좜
  • 일반적으둜 λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•œλ‹€λŠ” 것은 κ·Έ λ©”μ„œλ“œμ˜ λͺ…λ Ή 집합이 μžˆλŠ” λ©”λͺ¨λ¦¬ μœ„μΉ˜λ₯Ό μ°Έμ‘°ν•˜μ—¬ λͺ…령을 μ‹€ν–‰ν•˜λŠ” 것
  • μž¬μ •μ˜λœ λ©”μ„œλ“œλŠ” μ‹€μ œ μΈμŠ€ν„΄μŠ€μ˜ λ©”μ„œλ“œ 호좜, μž¬μ •μ˜λ˜μ§€ μ•Šμ€ λ©”μ„œλ“œλŠ” μƒμœ„ 클래슀 λ©”μ„œλ“œ 호좜 (ν›„μžλŠ” ν˜ΈμΆœν•˜λŠ” λ©”μ„œλ“œ μ£Όμ†Œκ°€ κ°™μŒ)

κ°€μƒλ©”μ„œλ“œ μ˜ˆμ‹œ 사진

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

  • ν•˜λ‚˜μ˜ μ½”λ“œκ°€ μ—¬λŸ¬ μžλ£Œν˜•μœΌλ‘œ κ΅¬ν˜„λ˜μ–΄ μ‹€ν–‰λ˜λŠ” 것 (같은 μ½”λ“œμ—μ„œ μ—¬λŸ¬ μ‹€ν–‰ κ²°κ³Ό λ‚˜μ˜€λŠ” 것)
  • 좔상 클래슀, μΈν„°νŽ˜μ΄μŠ€μ—μ„œ κ΅¬ν˜„λ¨
  • λ¬΅μ‹œμ  클래슀 ν˜• λ³€ν™˜κ³Ό 가상 λ©”μ„œλ“œλ₯Ό λ°”νƒ•μœΌλ‘œ 함
  • μƒμœ„ ν΄λž˜μŠ€μ—μ„œ 곡톡 λΆ€λΆ„μ˜ λ©”μ„œλ“œλ₯Ό μ œκ³΅ν•˜κ³ , ν•˜μœ„ ν΄λž˜μŠ€μ—μ„œ μΆ”κ°€ μš”μ†Œλ₯Ό 덧뢙여 κ΅¬ν˜„
  • λ˜λŠ” 상속받은 λͺ¨λ“  클래슀λ₯Ό ν•˜λ‚˜μ˜ μƒμœ„ 클래슀둜 처리
  • λ‹€ν˜•μ„±μ„ ν™œμš©ν•˜μ—¬ μœ μ—°ν•˜λ©΄μ„œλ„ κ΅¬μ‘°ν™”λ˜κ³ , ν™•μž₯μ„± 있고 μœ μ§€λ³΄μˆ˜ν•˜κΈ° 쒋은 ν”„λ‘œκ·Έλž¨ 개발 κ°€λŠ₯

μ•„λž˜λŠ” λ‹€ν˜•μ„±μ„ ν™œμš©ν•œ μ½”λ“œμ΄λ‹€.

class Animal {
    public void move() {
        System.out.println("동물이 μ›€μ§μž…λ‹ˆλ‹€.");
    }
}

class Human extends Animal {
    public void move() {
        System.out.println("μ‚¬λžŒμ΄ 두 발둜 κ±·μŠ΅λ‹ˆλ‹€.");
    }
}

class Tiger extends Animal {
    public void move() {
        System.out.println("ν˜Έλž‘μ΄κ°€ λ„€ 발둜 λœλ‹ˆλ‹€.");
    }
}

class Eagle extends Animal {
    public void move() {
        System.out.println("λ…μˆ˜λ¦¬κ°€ ν•˜λŠ˜μ„ λ‚©λ‹ˆλ‹€.");
    }
}

public class AnimalTest1 {
    public static void main(String[] args) {
        AnimalTest1 aTest = new AnimalTest1();
        aTest.moveAnimal(new Human());
        aTest.moveAnimal(new Tiger());
        aTest.moveAnimal(new Eagle());
    }

    public void moveAnimal(Animal animal) {
        animal.move();
    }
}
  • μ•žμ—μ„œ 봀듯이 상속을 μ‚¬μš©ν•˜λ©΄ λͺ¨λ“  λ“±κΈ‰μ—μ„œ κ³΅ν†΅μœΌλ‘œ μ‚¬μš©ν•˜λŠ” μ½”λ“œ 뢀뢄은 μƒμœ„ ν΄λž˜μŠ€μ— κ΅¬ν˜„ν•˜κ³ , 각 등급별 λ‚΄μš©μ€ 각각의 ν•˜μœ„ ν΄λž˜μŠ€μ— κ΅¬ν˜„
  • 상속을 μ‚¬μš©ν•˜λŠ” 것이 항상 쒋은 것은 μ•„λ‹˜ (IS-A 관계일 λ•Œ μ‚¬μš©ν•˜λŠ” 것이 κ°€μž₯ 효율적, 일반 클래슀λ₯Ό 점차 κ΅¬μ²΄ν™”ν•˜λŠ” 상황)
  • λ‹¨μˆœνžˆ μ½”λ“œ μž¬μ‚¬μš©μ˜ λͺ©μ μœΌλ‘œ μ„œλ‘œ 관련이 μ—†λŠ” 클래슀λ₯Ό 상속 κ΄€κ³„λ‘œ μ‚¬μš©ν•˜λŠ” 것은 쒋지 μ•ŠμŒ

μ°Έκ³ ) IS-A 관계 : 일반적인 κ°œλ…κ³Ό ꡬ체적인 관계 (is a relationship; basic.inheritance)
μ°Έκ³ ) HAS-A 관계 : ν•œ ν΄λž˜μŠ€κ°€ λ‹€λ₯Έ 클래슀λ₯Ό μ†Œμœ ν•œ 관계 (has a relationship; association), 이 경우 상속은 μ˜³μ§€ μ•ŠμŒ

λ‹€μš΄ μΊμŠ€νŒ… (down casting)

  • λ‹€μš΄ μΊμŠ€νŒ… : μƒμœ„ 클래슀둜 ν˜• λ³€ν™˜λ˜μ—ˆλ˜ ν•˜μœ„ 클래슀λ₯Ό λ‹€μ‹œ μ›λž˜ μžλ£Œν˜•μœΌλ‘œ ν˜• λ³€ν™˜ν•˜λŠ” 것
  • instanceof : μžλ£Œν˜•μ„ ν™•μΈν•˜λŠ” ν‚€μ›Œλ“œ (ν˜•λ³€ν™˜ν•˜κΈ° μ „ μ›λž˜ μΈμŠ€ν„΄μŠ€ μžλ£Œν˜•)
  • ν•˜μœ„ 클래슀둜 ν˜•λ³€ν™˜ ν•  λ•ŒλŠ” λͺ…μ‹œμ μœΌλ‘œ ν•΄μ•Ό 함

μ•„λž˜λŠ” λ‹€μš΄ μΊμŠ€νŒ…μ„ κ΅¬ν˜„ν•œ μ½”λ“œμ΄λ‹€.

Animal hAnimal = new Human();
if(hAnimal instanceof Human) {    // hAnimal μΈμŠ€ν„΄μŠ€ μžλ£Œν˜•μ΄ Humanν˜•μ΄λΌλ©΄
  Human human = (Human)hAnimal;   // μΈμŠ€ν„΄μŠ€ hAnimal을 Humanν˜•μœΌλ‘œ λ‹€μš΄ μΊμŠ€νŒ…
}

좔상 클래슀 (abstract class)

  • 좔상 ν΄λž˜μŠ€λŠ” 항상 좔상 λ©”μ„œλ“œ(abstract method)λ₯Ό 포함
  • 좔상 λ©”μ„œλ“œλŠ” κ΅¬ν˜„ μ½”λ“œκ°€ μ—†μŒ (ν•¨μˆ˜ λͺΈμ²΄κ°€ μ—†μŒ)
  • 좔상 λ©”μ„œλ“œλ₯Ό μ„ μ–Έν•  λ•ŒλŠ” abstract μ˜ˆμ•½μ–΄ μ‚¬μš©
  • 좔상 λ©”μ„œλ“œλ₯Ό 가진 좔상 ν΄λž˜μŠ€μ—λ„ abstract μ˜ˆμ•½μ–΄ μ‚¬μš©ν•΄μ•Ό 함
  • ν•¨μˆ˜μ˜ κ΅¬ν˜„λΆ€(implementation)(μ€‘κ΄„ν˜Έλ‘œ 감싼 λΆ€λΆ„)
  • μ‹€μ œ 좔상 ν΄λž˜μŠ€λŠ” λ§Žμ€ ν”„λ ˆμž„μ›Œν¬μ—μ„œ μ‚¬μš©ν•˜κ³  μžˆλŠ” κ΅¬ν˜„ 방식

μ•„λž˜λŠ” addλΌλŠ” 좔상 λ©”μ„œλ“œλ₯Ό κ΅¬ν˜„ν•œ μ½”λ“œμ΄λ‹€.

abstract int add(int x, int y);

λ‹€μŒκ³Ό 같이 ;κ°€ μ•„λ‹Œ {}λ₯Ό μ‚¬μš©ν•œ λ©”μ„œλ“œλŠ” 좔상 λ©”μ„œλ“œκ°€ μ•„λ‹ˆλ‹€. (ν•¨μˆ˜ κ΅¬ν˜„λΆ€κ°€ λΉ„μ–΄μžˆλŠ” λ©”μ„œλ“œλ₯Ό κ΅¬ν˜„ν•œ 것)

int add(int x, int y) {}
  • 좔상 클래슀λ₯Ό μƒμ†λ°›λŠ” ν΄λž˜μŠ€μ— 좔상 λ©”μ„œλ“œμ˜ κ΅¬ν˜„μ— λŒ€ν•œ μ±…μž„μ„ μœ„μž„ν•¨
  • ν•˜μœ„ ν΄λž˜μŠ€μ—μ„œ κ³΅ν†΅μœΌλ‘œ μ‚¬μš©ν•  λ©”μ„œλ“œλŠ” 일반 λ©”μ„œλ“œ, ν•˜μœ„ ν΄λž˜μŠ€λ§ˆλ‹€ λ‹€λ₯΄κ²Œ κ΅¬ν˜„ν•  λ•ŒλŠ” 좔상 λ©”μ„œλ“œλ‘œ μ„ μ–Έ
  • λͺ¨λ“  λ©”μ„œλ“œλ₯Ό κ΅¬ν˜„ν•œ ν΄λž˜μŠ€μ— abstract μ˜ˆμ•½μ–΄λ₯Ό μ‚¬μš©ν•˜μ—¬λ„ 좔상 ν΄λž˜μŠ€μž„ (μ™„λ²½ν•œ κ΅¬ν˜„μ΄ μ•„λ‹Œ 곡톡 κΈ°λŠ₯만 κ΅¬ν˜„ν•œ 클래슀, 즉 μƒμ†λ§Œμ„ μœ„ν•΄ λ§Œλ“  ν΄λž˜μŠ€λŠ” 좔상 클래슀둜 λ§Œλ“¦)
  • 좔상 ν΄λž˜μŠ€λŠ” new μ˜ˆμ•½μ–΄λ‘œ μΈμŠ€ν„΄μŠ€λ₯Ό 생성할 수 μ—†μŒ
λ©”μ„œλ“œ νŠΉμ§•
κ΅¬ν˜„λœ λ©”μ„œλ“œ ν•˜μœ„ ν΄λž˜μŠ€μ—μ„œ κ³΅ν†΅μœΌλ‘œ μ‚¬μš©ν•  κ΅¬ν˜„ μ½”λ“œ. ν•˜μœ„ ν΄λž˜μŠ€μ—μ„œ μž¬μ •μ˜ κ°€λŠ₯
좔상 λ©”μ„œλ“œ ν•˜μœ„ ν΄λž˜μŠ€κ°€ μ–΄λ–€ ν΄λž˜μŠ€λƒμ— 따라 κ΅¬ν˜„ μ½”λ“œκ°€ 달라짐

ν…œν”Œλ¦Ώ λ©”μ„œλ“œ (basic.template method)

  • λ””μžμΈ νŒ¨ν„΄μ˜ ν•œ λ°©λ²•μœΌλ‘œ, λͺ¨λ“  객체지ν–₯ ν”„λ‘œκ·Έλž¨μ—μ„œ μ‚¬μš©ν•˜λŠ” κ΅¬ν˜„ 방법
  • λ©”μ„œλ“œ μ‹€ν–‰ μˆœμ„œμ™€ μ‹œλ‚˜λ¦¬μ˜€λ₯Ό μ •μ˜ν•˜λŠ” λ©”μ„œλ“œ
  • ν•˜μœ„ ν΄λž˜μŠ€μ— 따라 κ΅¬ν˜„ λ‚΄μš©μ΄ λ°”λ€ŒλŠ” 것 말고, λ³€ν•˜μ§€ μ•ŠλŠ” μ‹œλ‚˜λ¦¬μ˜€λ₯Ό ν…œν”Œλ¦Ώ λ©”μ„œλ“œλ‘œ μ •μ˜
  • ν…œν”Œλ¦Ώ λ©”μ„œλ“œλŠ” μ‹œλ‚˜λ¦¬μ˜€λ₯Ό μ •μ˜ν•œ λ©”μ„œλ“œ, 즉 κ³΅ν†΅μœΌλ‘œ μ‚¬μš©ν•˜λŠ” λ©”μ„œλ“œμ΄λ―€λ‘œ ν•˜μœ„ ν΄λž˜μŠ€μ—μ„œ μž¬μ •μ˜ν•˜λ©΄ μ•ˆ 됨 (κ·Έλž˜μ„œ final μ˜ˆμ•½μ–΄ μ‚¬μš©)
  • 둜직 흐름이 이미 μ •ν•΄μ Έ μžˆλŠ” ν”„λ ˆμž„μ›Œν¬μ—μ„œ 많이 μ‚¬μš©ν•˜λŠ” κΈ°λ³Έ κ΅¬ν˜„ 방법
public abstract class Car {
    public abstract void drive();
    public abstract void stop();

    public void startCar() {
        System.out.println("μ‹œλ™μ„ μΌ­λ‹ˆλ‹€.");
    }

    public void turnOff() {
        System.out.println("μ‹œλ™μ„ λ•λ‹ˆλ‹€.");
    }

    // ν…œν”Œλ¦Ώ λ©”μ„œλ“œ
    final public void run() {
        startCar();
        drive();
        stop();
        turnOff();
    }
}

final μ˜ˆμ•½μ–΄

  • final μ˜ˆμ•½μ–΄λ₯Ό μ‚¬μš©ν•˜λ©΄ 더 이상 μˆ˜μ •ν•  수 μ—†λ‹€λŠ” 뜻
  • μžλ°”μ—μ„œ final μ˜ˆμ•½μ–΄λŠ” λ³€μˆ˜, λ©”μ„œλ“œ, ν΄λž˜μŠ€μ— μ‚¬μš© κ°€λŠ₯
  • μƒμˆ˜ μ„ μ–Έ μ‹œ 일반 λ³€μˆ˜μ™€ κ΅¬λ³„ν•˜κΈ° μœ„ν•΄ λŒ€λ¬Έμžλ‘œ 씀
μ‚¬μš© μœ„μΉ˜ μ„€λͺ…
λ³€μˆ˜ final λ³€μˆ˜λŠ” μƒμˆ˜λ₯Ό 의미
λ©”μ„œλ“œ final λ©”μ„œλ“œλŠ” ν•˜μœ„ ν΄λž˜μŠ€μ—μ„œ μž¬μ •μ˜ λΆˆκ°€
클래슀 final ν΄λž˜μŠ€λŠ” 상속 λΆˆκ°€
final double PI = 3.14;
System.out.println(PI);
PI = 1.23; // error
  • λ³΄μ•ˆκ³Ό κ΄€λ ¨λ˜μ–΄ μžˆκ±°λ‚˜ 기반 ν΄λž˜μŠ€κ°€ λ³€ν•˜λ©΄ μ•ˆ λ˜λŠ” 경우 클래슀λ₯Ό final둜 μ„ μ–Έ
  • λŒ€ν‘œμ μœΌλ‘œ JDKμ—μ„œ String, Integer 클래슀 등이 final둜 μ„ μ–Έν•œ 클래슀

ν…ŒμŠ€νŠΈ 주도 개발 (Test Driven Development; TDD)

  • ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό λ¨Όμ € κ°œλ°œν•˜λŠ” 개발 방법둠 (studentTest.java -> student.java)
  • 이미 ν•™μŠ΅ν•œ μ½”λ“œλ₯Ό μ΄ν•΄ν•˜λ©΄μ„œ 자기만의 μ½”λ”© κ°€λŠ₯
  • ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό λ§Œλ“€ 수 μžˆλ‹€λŠ” 것은 이미 κ΅¬ν˜„ μ½”λ“œκ°€ 머릿속에 μžˆλ‹€λŠ” 뜻

μΈν„°νŽ˜μ΄μŠ€ (interface)

  • λ™μΌν•œ λͺ©μ  ν•˜μ— λ™μΌν•œ κΈ°λŠ₯을 μˆ˜ν–‰ν•˜κ²Œ ν•˜λŠ” 것이 μΈν„°νŽ˜μ΄μŠ€μ˜ μ—­ν• 
  • 클래슀 ν˜Ήμ€ ν”„λ‘œκ·Έλž¨μ΄ μ œκ³΅ν•˜λŠ” κΈ°λŠ₯을 λͺ…μ‹œμ μœΌλ‘œ μ„ μ–Έ
  • 좔상 λ©”μ„œλ“œμ™€ μƒμˆ˜λ‘œ 이루어짐
  • μΈν„°νŽ˜μ΄μŠ€ λ‚΄μ˜ λ©”μ„œλ“œλŠ” public abstract μ˜ˆμ•½μ–΄λ₯Ό λͺ…μ‹œν•˜μ§€ μ•Šμ•„λ„ 컴파일 κ³Όμ •μ—μ„œ μžλ™μœΌλ‘œ μΆ”μƒλ©”μ„œλ“œλ‘œ λ³€ν™˜
  • μΈν„°νŽ˜μ΄μŠ€ 내에 μ„ μ–Έν•œ λ³€μˆ˜λŠ” 컴파일 κ³Όμ •μ—μ„œ μƒμˆ˜λ‘œ μžλ™ λ³€ν™˜λ¨
  • μžλ°”μ˜ λ‹€ν˜•μ„±μ„ κ·ΉλŒ€ν™”ν•˜μ—¬ 개발 μ½”λ“œ μˆ˜μ •μ„ 쀄이고 ν”„λ‘œκ·Έλž¨ μœ μ§€λ³΄μˆ˜μ„±μ„ 높이기 μœ„ν•΄ μ‚¬μš©
public interface Calc {
    double PI = 3.14;
    int ERROR = -99999999;

    int add(int num1, int num2);
    int substract(int num1, int num2);
    int times(int num1, int num2);
    int divide(int num1, int num2);
}
  • implements : ν΄λž˜μŠ€μ—μ„œ μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•  λ•Œ μ“°λŠ” ν‚€μ›Œλ“œ
  • μΈν„°νŽ˜μ΄μŠ€λ‘œλŠ” new둜 μΈμŠ€ν„΄μŠ€λ₯Ό 생성할 수 μ—†μŒ
public class LeastJob implements Scheduler {
    @Override
    public void getNextCall() {
        System.out.println("상담 μ „ν™”λ₯Ό μˆœμ„œλŒ€λ‘œ λŒ€κΈ°μ—΄μ—μ„œ κ°€μ Έμ˜΅λ‹ˆλ‹€.");
    }

    @Override
    public void sendCallToAgent() {
        System.out.println("ν˜„μž¬ 상담 업무가 μ—†κ±°λ‚˜ λŒ€κΈ°κ°€ κ°€μž₯ 적은 μƒλ‹΄μ›μ—κ²Œ ν• λ‹Ήν•©λ‹ˆλ‹€.");
    }
}
  • μžλ°” 8λΆ€ν„°λŠ” μΈν„°νŽ˜μ΄μŠ€ ν™œμš©μ„±μ„ 높이기 μœ„ν•΄ λ””ν΄νŠΈ λ©”μ„œλ“œμ™€ 정적 λ©”μ„œλ“œ κΈ°λŠ₯을 제곡
  • λ””ν΄νŠΈ λ©”μ„œλ“œ : μΈν„°νŽ˜μ΄μŠ€μ—μ„œ κ΅¬ν˜„ μ½”λ“œκΉŒμ§€ μž‘μ„±ν•œ λ©”μ„œλ“œ (μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ ν΄λž˜μŠ€μ—μ„œ μ½”λ“œ κ΅¬ν˜„ν•  ν•„μš” μ—†μŒ)
  • 정적 λ©”μ„œλ“œ : μΈμŠ€ν„΄μŠ€ 생성과 상관없이 μ‚¬μš©ν•  수 μžˆλŠ” λ©”μ„œλ“œ

기타 라이브러리

μ˜ˆμ™Έ 처리

  • μ—λŸ¬λŠ” 컴파일 μ—λŸ¬(compile error)와 μ‹€ν–‰ μ—λŸ¬(runtime error) 두 μ’…λ₯˜κ°€ 있음
  • μ‹€μ œ μ„œλΉ„μŠ€μ˜ κ²½μš°μ—λŠ” μ‹€ν–‰ μ—λŸ¬κ°€ 생기면 μ„œλΉ„μŠ€κ°€ μ€‘μ§€λ˜λ―€λ‘œ λ¬Έμ œκ°€ 심각해짐
  • μžλ°”λŠ” μ΄λŸ¬ν•œ 비정상 μ’…λ£Œλ₯Ό 쀄이기 μœ„ν•΄ λ‹€μ–‘ν•œ μ˜ˆμ™Έ 처리 방법을 μ œκ³΅ν•¨
  • μ„œλΉ„μŠ€κ°€ 운영 쀑인 경우 남긴 둜그(log) 뢄석을 톡해 원인을 찾을 수 있음

About

🌱 μžλ°”μ™€ 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ˜ 기본을 λ‹€μ§‘λ‹ˆλ‹€ 🌱

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages