λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

Java/Java의 정석

Chapter 01 - μžλ°”λ₯Ό μ‹œμž‘ν•˜κΈ° 전에

μžλ°” (Java Programming Language)

μžλ°”λž€?

  • 썬 λ§ˆμ΄ν¬λ‘œμ‹œμŠ€ν…œμ¦ˆμ—μ„œ 개발 ν›„ 1996λ…„ 1μ›” 곡식 λ°œν‘œ
  • 운영체제 독립적
    • 인터넷 ν™˜κ²½μ—μ„œ 인기 (λ‹€μ–‘ν•œ OSκ°€ κ³΅μ‘΄ν•˜κΈ° λ•Œλ¬Έ)
  • 객체지ν–₯κ³Ό c++κ³Ό 같은 λ‹€λ₯Έ μ–Έμ–΄μ˜ μž₯점을 채택
    • 쉽고 κ°„κ²°ν•œ ν‘œν˜„
  • 2010λ…„ μ˜€λΌν΄μ‚¬κ°€ 인수

μžλ°”μ˜ 역사

  • 1991λ…„ 였크(Oak)μ—μ„œ κ³ μ•ˆ
    • μ›λž˜ μ˜€ν¬λŠ” κ°€μ „μ œν’ˆκ³Ό 같은 μ†Œν˜• κΈ°κΈ°κ°€ λͺ©μ 
    • 운영체제 독립적
  • 개발 λ°©ν–₯을 λ°”κΎΌ ν›„ ν•« μžλ°”(Hot java) μΆœμ‹œ ν›„ 1996λ…„ 1월에 μžλ°” 정식 λ°œν‘œ
  • μ• ν”Œλ¦Ώ 이후 μ„œλΈ”λ¦Ώκ³Ό JSP, μ•ˆλ“œλ‘œμ΄λ“œμ—μ„œλ„ μžλ°” 채택

μžλ°” μ–Έμ–΄μ˜ νŠΉμ§•

  • 운영 μ²΄μ œμ— 독립적
    • ν”„λ‘œκ·Έλž¨μ€ μš΄μ˜μ²΄μ œμ— 독립적
    • 이λ₯Ό ν•΄μ„ν•˜λŠ” JVM은 μš΄μ˜μ²΄μ œμ— 쒅속적
      • μ—¬λŸ¬ μš΄μ˜μ²΄μ œμ—” μ„œλ‘œ λ‹€λ₯Έ λ²„μ „μ˜ JVM 제곡
  • 객체지ν–₯μ–Έμ–΄
    • μˆœμˆ˜ν•œ 객체지ν–₯μ–Έμ–΄
    • 상속, μΊ‘μŠν™”, λ‹€ν˜•μ„±μ΄ 적용
  • 비ꡐ적 배우기 쉬움
    • C++μ—μ„œ μ—°μ‚°μžμ™€ κΈ°λ³Έ ꡬ문
    • 슀λͺ° 톑(small talk)μ—μ„œ 객체지ν–₯
    • κ°„κ²°ν•˜κ³  λͺ…λ£Œν•œ 객체지ν–₯적 섀계
  • μžλ™ λ©”λͺ¨λ¦¬ 관리 (Garbage Collection)
    • 가비지 컬렉터가 μžλ™μœΌλ‘œ λ©”λͺ¨λ¦¬ 관리
    • λΉ„νš¨μœ¨μ μΈ 면도 μžˆμ§€λ§Œ ν”„λ‘œκ·Έλž˜λ¨ΈλŠ” ν”„λ‘œκ·Έλž˜λ°μ— 더 집쀑
  • λ„€νŠΈμ›Œν¬μ™€ λΆ„μ‚°μ²˜λ¦¬ 지원
    • λ‹€μ–‘ν•œ λ„€νŠΈμ›Œν¬ ν”„λ‘œκ·Έλž˜λ° 라이브러리 (Java API) 지원
  • λ©€ν‹° μŠ€λ ˆλ“œ 지원
    • μžλ°”λŠ” μ‹œμŠ€ν…œκ³ΌλŠ” κ΄€κ³„μ—†λŠ” λ©€ν‹° μŠ€λ ˆλ“œ ν”„λ‘œκ·Έλž¨ κ΅¬ν˜„ κ°€λŠ₯
      • κ΄€λ ¨λœ 라이브러리 제곡 (Java API)
    • μžλ°” 인터프리터가 μ—¬λŸ¬ μ“°λ ˆλ“œμ˜ μŠ€μΌ€μ€„λ§ λ‹΄λ‹Ή
  • 동적 λ‘œλ”© (Dynamic Loading) 지원
    • μ‹€ν–‰ μ‹œμ— λͺ¨λ“  ν΄λž˜μŠ€κ°€ λ‘œλ”© X
      • ν•„μš”ν•œ μ‹œμ μ— 클래슀λ₯Ό λ‘œλ”©
    • 일뢀 클래슀 λ³€κ²½ μ‹œ or μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ λ³€κ²½ μ‹œ 비ꡐ적 적은 μž‘μ—…μœΌλ‘œ 처리

JVM (Java Virtual Machine)

μžλ°”λ₯Ό μ‹€ν–‰ν•˜κΈ° μœ„ν•œ 가상 기계

가상 κΈ°κ³„λž€ μ†Œν”„νŠΈμ›¨μ–΄λ‘œ κ΅¬ν˜„λœ ν•˜λ“œμ›¨μ–΄ (μœˆλ„μš° λ―Έλ””μ–΄ ν”Œλ ˆμ΄μ–΄, μœˆμ•°ν”„), 컴퓨터 μ†μ˜ 컴퓨터

  • μžλ°”λ‘œ μž‘μ„±λœ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ€ λͺ¨λ‘ JVMμ—μ„œλ§Œ μ‹€ν–‰
    • 싀행을 μœ„ν•΄ λ°˜λ“œμ‹œ JVM이 ν•„μš”

일반 μ• ν”Œλ¦¬μΌ€μ΄μ…˜κ³Ό 비ꡐ

  • 일반 μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜
  • 일반 μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜ <-> OS <-> 컴퓨터
  • λ‹€μ–‘ν•œ OS용 JVM

JAVA μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜ <-> Windows용 JVM _<-> OS(Window) <-> 컴퓨터_
JAVA μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜ <-> Macintosh용 JVM _<-> OS(Macintosh) <-> 컴퓨터_
JAVA μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜ <-> Linux용 JVM _<-> OS(Linux) <-> 컴퓨터_

  • μ‹€ν–‰ μ‹œ 해석이 ν•„μš”ν•΄ 속도가 느린 점은 JIT 컴파일러 & μ΅œμ ν™” 기술둜 격차λ₯Ό μ€„μž„
  • 일반 μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ€ OS 쒅속적
  • μžλ°” μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ€ JVM이 OS 쒅속적
    • μžλ°” μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ€ OS와 ν•˜λ“œμ›¨μ–΄μ— 독립적
      • Write once, run anywhere.

 

μžλ°” 개발 ν™˜κ²½ κ΅¬μΆ•ν•˜κΈ°

μžλ°” κ°œλ°œλ„κ΅¬(JDK) μ„€μΉ˜ν•˜κΈ°

JDK와 μžλ°” 클래슀 라이브러리, μžλ°”λ₯Ό κ°œλ°œν•˜λŠ”λ° ν•„μš”ν•œ ν”„λ‘œκ·Έλž¨λ“€μ΄ μ„€μΉ˜

JDK bin λ””λ ‰ν„°λ¦¬μ˜ μ£Όμš” μ‹€ν–‰νŒŒμΌ

  • javac.exe
    • μžλ°” 컴파일러, μžλ°” μ†ŒμŠ€μ½”λ“œλ₯Ό λ°”μ΄νŠΈμ½”λ“œλ‘œ 컴파일
  • java.exe
    • μžλ°” 인터프리터, μ»΄νŒŒμΌλŸ¬κ°€ μƒμ„±ν•œ λ°”μ΄νŠΈμ½”λ“œ 해석 ν›„ μ‹€ν–‰
  • javap.exe
    • μ—­μ–΄μ…ˆλΈ”λŸ¬, 컴파일된 클래슀 νŒŒμΌμ„ μ›λž˜μ˜ μ†ŒμŠ€λ‘œ λ³€ν™˜
  • javadoc.exe
    • μžλ™λ¬Έμ„œ 생성기
    • μ†ŒμŠ€ νŒŒμΌμ—μ„œ 주석(/** */)으둜 API λ¬Έμ„œμ™€ 같은 ν˜•μ‹μ˜ λ¬Έμ„œ μžλ™ 생성
  • jar.exe
    • μ••μΆ•ν”„λ‘œκ·Έλž¨
    • 클래슀 파일 & ν”„λ‘œκ·Έλž¨μ˜ 싀행에 κ΄€λ ¨λœ 파일둜 μ••μΆ•

JAVA API λ¬Έμ„œ μ„€μΉ˜ν•˜κΈ°

  • https://java.sun.com/ λ‹€μš΄ κ°€λŠ₯
  • μ‚¬μ „μ²˜λŸΌ ν•„μš”ν•  λ•Œ μ°Ύμ•„μ„œ μ‚¬μš©ν•  것

μžλ°”λ‘œ ν”„λ‘œκ·Έλž¨ μž‘μ„±ν•˜κΈ°

Hello.java

  • 클래슀의 이름과 .java 파일의 이름이 λŒ€μ†Œλ¬ΈμžκΉŒμ§€ μ •ν™•νžˆ κ°™μ•„μ•Ό 함
  • μˆœμ„œ
    • Hello.java -> (javac.exeκ°€ 컴파일) -> Hello.class -> (java.exe둜 μ‹€ν–‰) -> ν”„λ‘œκ·Έλž¨
  • μžλ°”μ˜ λͺ¨λ“  μ½”λ“œλŠ” λ°˜λ“œμ‹œ 클래슀 μ•ˆμ—
    • ν΄λž˜μŠ€λ“€μ΄ λͺ¨μ—¬ μ• ν”Œλ¦¬μΌ€μ΄μ…˜
    • ν‚€μ›Œλ“œ class 뒀에 이름 μž‘μ„± ν›„ κ΄„ν˜Έ μ•ˆμ— μ½”λ“œ
  • public static void main(String[] args)λŠ” main λ©”μ„œλ“œ μ„ μ–ΈλΆ€
    • 항상 λ˜‘κ°™μ΄ 적어주어야 함
    • ν•˜λ‚˜μ˜ Java μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—” main λ©”μ„œλ“œκ°€ λ°˜λ“œμ‹œ ν•„μš”
  • ν•˜λ‚˜μ˜ μ†ŒμŠ€ νŒŒμΌμ— μ—¬λŸ¬ 가지 ν΄λž˜μŠ€λ„ κ°€λŠ₯
    • public class의 이름과 μ†ŒμŠ€ 파일 이름이 μΌμΉ˜ν•΄μ•Ό λœλ‹€.
    • public classκ°€ μ—†λ‹€λ©΄ μ–΄λ–€ ν΄λž˜μŠ€λ“  OK
    • μ†ŒμŠ€μ™€ 달리 클래슀 νŒŒμΌμ€ classλ§ˆλ‹€ ν•˜λ‚˜μ”© 생성

자주 λ°œμƒν•˜λŠ” μ—λŸ¬μ™€ ν•΄κ²° 방법

  • cannot find symbol λ˜λŠ” cannot resolve symbol
    • μ§€μ •λœ λ³€μˆ˜λ‚˜ λ©”μ„œλ“œλ₯Ό 찾을 수 없을 λ•Œ
    • λŒ€μ†Œλ¬ΈμžκΉŒμ§€ κΌΌκΌΌν•˜κ²Œ 확인
  • ';' expected
    • μ„Έλ―Έμ½œλ¦°μ΄ ν•„μš”ν•œ 곳에 없을 λ•Œ
    • μžλ°”λŠ” λͺ¨λ“  λ¬Έμž₯의 끝에 μ„Έλ―Έμ½œλ‘  ν•„μš”
  • Exception in thread "main" java.lang.NoSuchMethodError: main
    • main λ©”μ„œλ“œλ₯Ό 찾을 수 없을 λ•Œ
    • ν΄λž˜μŠ€μ— main λ©”μ„œλ“œκ°€ μ •μ˜λ˜μ–΄ μžˆλŠ”μ§€ 확인
    • λ©”μ„œλ“œμ˜ μ„ μ–ΈλΆ€ μ˜€νƒ€ 확인
      • λŒ€μ†Œλ¬Έμž 포함
  • Exception in thread "main" java.lang.NoSuchClassError: Hello
    • HelloλΌλŠ” 클래슀λ₯Ό 찾을 수 없을 λ•Œ
    • 클래슀 Hello의 철자 확인
      • λŒ€μ†Œλ¬Έμž 포함
    • 클래슀 패슀 섀정도 확인
  • illegal start of expression
    • λ¬Έμž₯에 문법적 였λ₯˜κ°€ μžˆμ„ λ•Œ
    • κ΄„ν˜Έ 확인
    • μˆ˜μ‹μ΄λ‚˜ if λ¬Έ, for λ¬Έ 등에 문법적 였λ₯˜ 확인
    • μ ‘κ·Ό μ œμ–΄μž ν‚€μ›Œλ“œ 확인
  • class, inteface, or enum expected
    • class, inteface, or enum에 λŒ€ν•œ 였λ₯˜
    • κ΄„ν˜Έμ˜ κ°œμˆ˜κ°€ μΌμΉ˜ν•˜μ§€ μ•Šμ„ λ•Œ
  • μ—λŸ¬κ°€ λ°œμƒν–ˆμ„ λ•Œ 처리 μˆœμ„œ
    • μ—λŸ¬ λ©”μ‹œμ§€λ₯Ό 읽고 ν•΄λ‹Ή μ½”λ“œ μ‚΄νŽ΄λ³΄κΈ°
      • 이상 없을 μ‹œ κ·Έ μ£Όλ³€ μ½”λ“œλ„
    • κ·Έλž˜λ„ 해결이 μ•ˆ 되면 기본적인 λΆ€λΆ„λ“€ 확인
    • μ˜μ‹¬μ΄ κ°€λŠ” 뢀뢄은 주석 처리 or ν…ŒμŠ€νŠΈ

μžλ°” ν”„λ‘œκ·Έλž¨μ˜ μ‹€ν–‰ κ³Όμ •

  • ν”„λ‘œκ·Έλž¨μ˜ 싀행에 ν•„μš”ν•œ 클래슀(*.class)λ₯Ό λ‘œλ“œ
  • 클래슀 파일 검사
    • 파일 ν˜•μ‹, μ•…μ„±μ½”λ“œ 체크
  • μ§€μ •λœ ν΄λž˜μŠ€μ—μ„œ main λ©”μ„œλ“œ 호좜

주석 (comment)

  • μ£Όμ„μœΌλ‘œ ν”„λ‘œκ·Έλž¨ μ½”λ“œμ— λŒ€ν•œ μ„€λͺ…을 덧뢙여 놓을 것
    • μž‘μ„±μž, μž‘μ„± μΌμ‹œ, 버전, 버전에 λ”°λ₯Έ λ³€κ²½ 이λ ₯
  • μ£Όμ„μ˜ μ’…λ₯˜
    • λ²”μœ„ 주석 : '/*'와 '*/'의 사이
    • ν•œ 쀄 주석 : '//'λΆ€ν„° 라인 끝
  • μ»΄νŒŒμΌλŸ¬λŠ” 주석을 λ¬΄μ‹œ
    • 주석이 λ§Žλ‹€κ³  ν•΄μ„œ ν”„λ‘œκ·Έλž¨ μ„±λŠ₯ μ €ν•˜ X
      • 주석을 적극적으둜 μ‚¬μš©ν•  것
        • 주석이 였히렀 방해될 땐 μ£Όμ„μ˜ 색을 배경색과 μœ μ‚¬ν•œ 색 μ‚¬μš©
  • ν°λ”°μ˜΄ν‘œ μ•ˆμ— μžˆμ„ 땐 주석이 μ•„λ‹Œ λ¬Έμžμ—΄λ‘œ 인식