πŸ–₯️ development/JAVA

[Chapter 05] μ°Έμ‘° νƒ€μž…

Dream Jin 2022. 12. 31. 02:18

Chapter 05 μ°Έμ‘°νƒ€μž…

5.1 데이터 νƒ€μž… λΆ„λ₯˜

  • 데이터 νƒ€μž…μ€ 크게 κΈ°λ³Ένƒ€μž…, μ°Έμ‘°νƒ€μž… 으둜 λ‚˜λ‰œλ‹€

    κΈ°λ³Ένƒ€μž…

    μ •μˆ˜ νƒ€μž… byte, char, short, int, long

    μ‹€μˆ˜ νƒ€μž… float, double

    논리 νƒ€μž… boolean

    μ°Έμ‘° νƒ€μž… β†’ μ°Έμ‘° νƒ€μž…μ΄λž€ 객체의 λ²ˆμ§€λ₯Ό μ°Έμ‘°ν•˜λŠ” νƒ€μž…

    λ°°μ—΄ νƒ€μž…, μ—΄κ±° νƒ€μž…, 클래슀, μΈν„°νŽ˜μ΄μŠ€

    κ°μ²΄λž€? 데이터(ν•„λ“œ)와 λ©”μ†Œλ“œ(μ‹€ν–‰ λΈ”λŸ­) 으둜 κ΅¬μ„±λœ 덩어리.

  • κΈ°λ³Ένƒ€μž…κ³Ό μ°Έμ‘°νƒ€μž…μ˜ μ°¨μ΄λŠ”, μ €μž₯λ˜λŠ” κ°’ 이닀. κΈ°λ³Ένƒ€μž…μ—λŠ” 값이 직접 μ €μž₯λ˜μ§€λ§Œ, μ°Έμ‘° νƒ€μž…μ—λŠ” heap μ˜μ—­μ— μ €μž₯된 λ²ˆμ§€μ£Όμ†Œκ°€ μ €μž₯λœλ‹€.

  • 즉, κΈ°λ³Ένƒ€μž…μ€ stack μ˜μ—­μ˜ λ³€μˆ˜μ— 값이 직접 μ €μž₯ λ˜μ§€λ§Œ, μ°Έμ‘° νƒ€μž…μ€ stack μ˜μ—­μ˜ λ³€μˆ˜κ°€ heap μ˜μ—­μ— μƒκΈ°λŠ” 객체의 μ£Όμ†Œκ°€ μ €μž₯λœλ‹€.

5.2 λ©”λͺ¨λ¦¬ μ‚¬μš© μ˜μ—­

  • μžλ°”μ—μ„œλŠ” java λͺ…λ Ήμ–΄λ‘œ JVM이 κ΅¬λ™λ˜λ©΄ μš΄μ˜μ²΄μ œμ— 할당받은 λ©”λͺ¨λ¦¬μ˜μ—­μ„ κ΅¬λΆ„ν•œλ‹€.
  1. λ©”μ†Œλ“œ(Method) μ˜μ—­
    λ°”μ΄νŠΈμ½”λ“œ 파일이 μ €μž₯λ˜λŠ” μ˜μ—­
  2. νž™(heap) μ˜μ—­
    객체가 μƒμ„±λ˜λŠ” μ˜μ—­
  3. μŠ€νƒ(Stack) μ˜μ—­
    κΈ°λ³Έ νƒ€μž… λ³€μˆ˜μ™€, μ°Έμ‘° νƒ€μž… λ³€μˆ˜κ°€ μƒμ„±λ˜κ³  μ œκ±°λœλ‹€.

즉 .java λΌλŠ” μ†ŒμŠ€νŒŒμΌμ΄ 컴파일 되면, .class λΌλŠ” λ°”μ΄νŠΈ μ½”λ“œνŒŒμΌμ΄ λ©”μ†Œλ“œ μ˜μ—­μ— μ €μž₯λœλ‹€. (JVM이 .class νŒŒμΌμ„ μ‹€ν–‰μ‹œν‚€κΈ° μœ„ν•˜μ—¬ λ©”μ†Œλ“œ μ˜μ—­μ— μ˜¬λ¦¬λŠ” 과정을 λ‘œλ”©Loading 이라고 ν•œλ‹€.) μ—¬κΈ°μ„œ λ©”μ†Œλ“œ μ˜μ—­μ˜ ν΄λž˜μŠ€λŠ” 각 λ°”μ΄νŠΈ μ½”λ“œ λ³„λ‘œ λ§Œλ“€μ–΄μ§€λ©°, λ©”μ†Œλ“œ μ½”λ“œλŠ” 1κ°œμ΄μ§€λ§Œ, μƒμ„±μž μ½”λ“œμ— μžˆλŠ” 객체의 경우 νž™ μ˜μ—­μ— μƒμ„±λ˜λ©° , μ—¬λŸ¬κ°œ κ°€μ§ˆμˆ˜ 있고, ν•΄λ‹Ή κ³Όμ •μ—μ„œ ν•„μš”ν•œ λ³€μˆ˜κ°€ μŠ€νƒ μ˜μ—­μ— μƒμ„±λœλ‹€.

5.3 μ°Έμ‘° νƒ€μž… λ³€μˆ˜μ˜ ==, β‰  μ—°μ‚°

  • μ°Έμ‘° νƒ€μž… λ³€μˆ˜μ—μ„œμ˜ ==, β‰  연산은 λ³€μˆ˜κ°€ μ°Έμ‘°ν•˜κ³ μžˆλŠ” λ²ˆμ§€λ₯Ό λΉ„κ΅ν•˜λŠ” 것 이닀.

5.4 nullκ³Ό NullPointerException

  • μ°Έμ‘° νƒ€μž… λ³€μˆ˜κ°€ 아직 λ²ˆμ§€λ₯Ό μ €μž₯ν•˜κ³  μžˆμ§€ μ•Šλ‹€λŠ” 뜻으둜 null(널) 값을 κ°€μ§ˆμˆ˜ μžˆλ‹€.
  • NullPointerException 의 경우 μ°Έμ‘° λ³€μˆ˜κ°€ 객체λ₯Ό μ°Έμ‘°ν•˜κ³  μžˆμ§€ μ•ŠλŠ”κ²ƒμ„ λ‚˜νƒ€λ‚Έλ‹€.
int[] intArray = null;
intArray[0] = 10; //NullPointerException -> μ°Έμ‘°λ³€μˆ˜κ°€ 객체λ₯Ό μ°Έμ‘°ν•˜κ³  μžˆμ§€ μ•Šκ΅¬λ‚˜.

String str = null;
System.out.println("총 문자 수:" + str.length()); //NullPointerException 

//μ˜›λ‚ μ—λŠ” μ•ˆμ“°λŠ” 객체의 λ©”λͺ¨λ¦¬λ₯Ό μ œκ±°ν• λ•Œ μ‚¬μš©ν•˜κΈ°λ„ ν•˜μ˜€λ‹€. 
String hobby = "μ—¬ν–‰";
hobby = null;

5.5 λ¬Έμžμ—΄(String) νƒ€μž…

  • μžλ°”μ˜ λ¬Έμžμ—΄μ€ String 객체둜 μƒμ„±λœλ‹€.
String name; //String νƒ€μž…μ˜ nameλ³€μˆ˜ μ„ μ–Έ
name = "홍길동"; //name λ³€μˆ˜μ— λ¬Έμžμ—΄ λŒ€μž…
String hobby = "μ—¬ν–‰"; //λ³€μˆ˜ μ„ μ–Έ, λ¬Έμžμ—΄ λŒ€μž…

λ¬Έμžμ—΄ 비ꡐ

  • μžλ°”λŠ” λ¬Έμžμ—΄ λ¦¬ν„°λŸ΄μ΄ λ™μΌν•˜λ‹€λ©΄ 같은 객체λ₯Ό κ³΅μœ ν•œλ‹€, ν•˜μ§€λ©΄ new μ—°μ‚°μžλ₯Ό ν†΅ν•˜μ—¬ λ‹€λ₯Έ 객체λ₯Ό λ§Œλ“€μˆ˜ μžˆλŠ”λ° 이λ₯Ό 객체 생성 μ—°μ‚°μž 라고 ν•œλ‹€.
String name1 = "홍길동";
String name2 = "홍길동"; 
// name1κ³Ό name2 λŠ” 같은 객체λ₯Ό μ°Έμ‘°ν•œλ‹€. name1 = name2

String name1 = new String("홍길동");
String name2 = new String("홍길동");
// name1이 μ°Έμ‘°ν•˜λŠ” 객체와, name2κ°€ μ°Έμ‘°ν•˜λŠ” κ°μ²΄λŠ” λ‹€λ₯΄λ‹€ name1 != name2
  • λ¬Έμžμ—΄ μ•ˆμ—μžˆλŠ” λ¦¬ν„°λŸ΄λ§Œ λΉ„κ΅ν•˜κΈ° μœ„ν•΄μ„œλŠ” equals() λ©”μ†Œλ“œλ₯Ό μ‚¬μš©ν•œλ‹€.
boolean result = str1.equals(str2); //str1 원본 λ¬Έμžμ—΄κ³Ό, str2의 비ꡐ λ¬Έμžμ—΄μ΄ 같은지 검사

//String λ³€μˆ˜λŠ” 빈 λ¬Έμžμ—΄("")을 λŒ€μž…ν•˜μ—¬  equals와 λΉ„κ΅ν• μˆ˜λ„ μžˆλ‹€. 

λ¬Έμžμ—΄ μΆ”μΆœ

  • νŠΉμ • 문자의 문자λ₯Ό μ–»κ³  μ‹Άμ„λ•Œ charAt() λ©”μ†Œλ“œ μ‚¬μš©
String subject = "μžλ°” ν”„λ‘œκ·Έλž˜λ°";
char charValue = subject.charAt(3);

//charValue = "ν”„"

λ¬Έμžμ—΄ 길이

  • λ¬Έμžμ—΄μ—μ„œ 문자의 개수λ₯Ό μ–»κ³  μ‹Άλ‹€λ©΄ length() λ©”μ†Œλ“œ μ‚¬μš© β†’ 곡백도 포함
String subject = "μžλ°” ν”„λ‘œκ·Έλž˜λ°";
int length = subject.length();

//length = 8

λ¬Έμžμ—΄ λŒ€μ²΄

  • νŠΉμ • λ¬Έμžμ—΄μ„ λ‹€λ₯Έ λ¬Έμžμ—΄λ‘œ λŒ€μ²΄ν•˜κ³ μž ν• λ•Œ replace() λ©”μ†Œλ“œ μ‚¬μš©
String oldStr = "μžλ°” ν”„λ‘œκ·Έλž˜λ°";
String newStr = oldStr.replace("μžλ°”", "JAVA");

//newStr = JAVA ν”„λ‘œκ·Έλž˜λ°

β†’ μ—¬κΈ°μ„œ μ€‘μš”ν•œ 뢀뢄은 ν•œλ²ˆ λ§Œλ“€μ–΄μ§„ κ°μ²΄λŠ” μˆ˜μ •μ΄ λΆˆκ°€λŠ₯ν•˜λ‹€. λ”°λΌμ„œ oldStr의 객체λ₯Ό μˆ˜μ •ν•˜λŠ” 것이 μ•„λ‹ˆλΌ, μƒˆλ‘œμš΄ 객체 newStr을 λ§Œλ“œλŠ” 것이닀.

λ¬Έμžμ—΄ μž˜λΌλ‚΄κΈ°

  • νŠΉμ • μœ„μΉ˜μ—μ„œ λ¬Έμžμ—΄μ„ μž˜λΌλ‚΄κ³  κ°€μ Έμ˜€κ³  μ‹Άλ‹€λ©΄ substring() λ©”μ†Œλ“œλ₯Ό μ‚¬μš©ν•œλ‹€.
String ssn = "221228-1234567";
String firstNum = ssn.substring(0,6); //0번 indexμ—μ„œ μ‹œμž‘ν•˜μ—¬, 6번째 κΉŒμ§€ 자λ₯Έλ‹€
String secondNum = ssn.substirng(7); //7번 indexμ—μ„œ λκΉŒμ§€ 자λ₯Έλ‹€

//firstnum = "221228"
//secondNum = "1234567"

λ¬Έμžμ—΄ μ°ΎκΈ°

  • λ¬Έμžμ—΄μ„ μ°ΎλŠ”λŒ€μ—λŠ” 2κ°€μ§€ 방법이 μžˆλ‹€. indexOf()λ©”μ†Œλ“œμ™€, contains()λ©”μ†Œλ“œ
String subject = "μžλ°” ν”„λ‘œκ·Έλž˜λ°";
int index = subject.indexOf("ν”„λ‘œκ·Έλž˜λ°");
//index = 3 λ¬Έμžμ—΄μ΄ μ—†λ‹€λ©΄ -1을 리턴, λ¬Έμžμ—΄μ΄ μžˆλ‹€λ©΄ μ‹œμž‘ν•˜λŠ” index λ₯Ό 리턴

boolean result = subject.contains("ν”„λ‘œκ·Έλž˜λ°");
//result = True λ¬Έμžμ—΄μ΄ ν¬ν•¨λ˜μ–΄ μžˆλ‹€λ©΄ true, μ•„λ‹ˆλ©΄ false

λ¬Έμžμ—΄ 뢄리

  • λ¬Έμžμ—΄μ΄ νŠΉμ •ν•œ κ΅¬λΆ„μžλ‘œ κ΅¬λΆ„λ˜μ–΄ μžˆμ„λ•Œ, split()λ©”μ†Œλ“œλ₯Ό μ΄μš©ν•˜μ—¬ λ‚˜λˆˆλ‹€.
String board = "번호,제λͺ©,λ‚΄μš©,글쓴이";
String[] arr = board.split(","); 

//arr -> "번호" "제λͺ©" "λ‚΄μš©" "글쓴이" κ°€ μ €μž₯이 λœλ‹€.
// μ΄λ ‡κ²Œ λ‚˜λ‰˜λŠ” 각각을 token이라고 λΆ€λ₯Έλ‹€. 

5.6 λ°°μ—΄(Array) νƒ€μž…

  • λ³€μˆ˜λŠ” ν•˜λ‚˜μ˜ κ°’λ§Œ μ €μž₯ν•  수 μžˆμ§€λ§Œ, λ°°μ—΄μ˜ 경우 μ—°μ†λœ 곡간에 값을 λ‚˜μ—΄μ‹œν‚€κ³ , 각 값에 indexλ₯Ό λΆ€μ—¬ν•œ 자료ꡬ쑰 이닀.
    1. 배열은 같은 νƒ€μž…μ˜ κ°’λ§Œ κ΄€λ¦¬ν•œλ‹€.
    2. λ°°μ—΄μ˜ κΈΈμ΄λŠ” λŠ˜λ¦¬κ±°λ‚˜ μ€„μΌμˆ˜ μ—†λ‹€.

λ°°μ—΄ λ³€μˆ˜ μ„ μ–Έ

  • 배열을 μ‚¬μš©ν•˜κΈ° μœ„ν•΄μ„œλŠ” λ°°μ—΄ λ³€μˆ˜λ₯Ό μ„ μ–Έ ν•˜μ—¬μ•Ό ν•œλ‹€.

2κ°€μ§€ 방법이 μžˆμ§€λ§Œ κ΄€λ‘€μ μœΌλ‘œ 1λ²ˆμ„ 많이 μ‚¬μš©ν•œλ‹€.

1)
νƒ€μž…[] λ³€μˆ˜;
int[] intArray;
double[] doubleArray;
String[] strArray;

2)
νƒ€μž… λ³€μˆ˜[];
int intArray[];
double doubleArray[];
String strArray[];

//λ°°μ—΄ μžμ²΄λ„ κ°μ²΄μ΄λ―€λ‘œ, νž™ μ˜μ—­μ— μƒμ„±λ˜λ©° null둜 μ΄ˆκΈ°ν™” ν• μˆ˜λ„ μžˆλ‹€.
int[] intArray = null;

κ°’ λͺ©λ‘μœΌλ‘œ λ°°μ—΄ 생성

νƒ€μž…[] λ³€μˆ˜ = {κ°’0, κ°’1, κ°’2, κ°’3, ...}
int[] intarr = {1,2,3,4,5};
  • μ£Όμ˜μ‚¬ν•­
일반 λ³€μˆ˜μ²˜λŸΌ
νƒ€μž…[] λ³€μˆ˜; 
λ³€μˆ˜ = {κ°’1, κ°’2, κ°’3....} 으둜 μ €μž₯ν•  수 μ—…μ‚³. // 컴파일 μ—λŸ¬ λ°œμƒ

λ³€μˆ˜ = new νƒ€μž…[] {κ°’1, κ°’2, κ°’3 ...}; //으둜 λŒ€μž…

String[] names = null;
names = new String[] {"κ°€λ‚˜λ‹€", "λΌλ§ˆλ°”", "μ‚¬μ•„μž"};
  • λ©”μ†Œλ“œμ˜ λ§€κ°œλ³€μˆ˜κ°€ λ°°μ—΄νƒ€μž… μΌλ•Œλ„ λ™μΌν•˜λ‹€.
//λ©”μ†Œλ“œ μ„ μ–Έ
void printItem(int[] scores){...}

//잘λͺ»λœ λ©”μ†Œλ“œ 호좜
printItem({10, 20, 30}); //컴파일 μ—λŸ¬

//μ˜¬λ°”λ₯Έ λ©”μ†Œλ“œ 호좜
printItem( new int[] {10, 20, 30});

new μ—°μ‚°μžλ‘œ 배열생성

  • λ°°μ—΄ ν•­λͺ© 값을 κΈ°λ³Έκ°’μœΌλ‘œ μ΄ˆκΈ°ν™”ν•œ μƒνƒœ β†’ 즉 값이 μ£Όμ–΄μ§€μ§€μ•Šκ³  길이만 μ •ν•΄μ„œ 배열을 λ§Œλ“  μƒνƒœ
νƒ€μž…[] λ³€μˆ˜ = new νƒ€μž…[길이];

int[] intarr = null;
intarr = new int[5]; // 길이가 5인 intνƒ€μž…μ˜ intarrλ°°μ—΄ 생성
-> λ°°μ—΄ μ•ˆμ—λŠ” 0을 μ˜λ―Έν•˜λŠ” κΈ°λ³Έ κ°’μœΌλ‘œ μ΄ˆκΈ°ν™” λœλ‹€. 

λ°°μ—΄ 길이

  • λ°°μ—΄μ˜ 길이의 경우 λ¬Έμžμ—΄μ˜ 길이λ₯Ό κ΅¬ν•˜λŠ” 방법과 λΉ„μŠ·ν•˜λ‹€.
λ°°μ—΄λ³€μˆ˜.length; -> forλ¬Έμ—μ„œ 전체 λ°°μ—΄ ν•­λͺ©μ„ λ°˜λ³΅ν• λ•Œ 자주 μ‚¬μš©λœλ‹€. 

5.7 닀차원 λ°°μ—΄

  • λ°°μ—΄ν•­λͺ©μ— λ˜λ‹€λ₯Έ 배열이 λŒ€μž…λœ 것 을 닀차원 배열이라 λΆ€λ₯Έλ‹€.
λ³€μˆ˜[1μ°¨μ›μΈλ±μŠ€][2μ°¨μ›μΈλ±μŠ€][3μ°¨μ›μΈλ±μŠ€] 

κ°’ λͺ©λ‘μœΌλ‘œ 닀차원 λ°°μ—΄ 생성

νƒ€μž…[][] λ³€μˆ˜ ={
{κ°’1, κ°’2, κ°’3, ...}, //1차원 λ°°μ—΄μ˜ 0 인덱슀
{κ°’4, κ°’5, κ°’6, ...}, //1차원 λ°°μ—΄μ˜ 1 인덱슀 
..
};

new μ—°μ‚°μžλ‘œ 닀차원 λ°°μ—΄ 생성

  • 1차원 λ°°μ—΄κ³Ό λ™μΌν•˜κ²Œ 값이 μ—†κ³  길이만 μ •ν•  경우
νƒ€μž…[][] λ³€μˆ˜ = new νƒ€μž…[1μ°¨μ›μˆ˜][2μ°¨μ›μˆ˜];
->
int[][] scores = new int[2][3];

5.8 객체λ₯Ό μ°Έμ‘°ν•˜λŠ” λ°°μ—΄

  • κΈ°λ³Έ νƒ€μž… 배열은 각 ν•­λͺ©μ— 직접 값을 μ €μž₯ν•˜μ§€λ§Œ, μ°Έμ‘° νƒ€μž…(클래슀, μΈν„°νŽ˜μ΄μŠ€) 배열은 각 ν•­λͺ©μ— λ°°μ—΄μ˜ λ²ˆμ§€λ₯Ό μ €μž₯ν•œλ‹€.

5.9 λ°°μ—΄ 볡사

  • λ°°μ—΄μ˜ 경우 ν•œ 번 μƒμ„±λ˜λ©΄ 길이λ₯Ό λ³€κ²½ν• μˆ˜ μ—†λ‹€. λ”°λΌμ„œ 더 λ§Žμ€ μ €μž₯ 곡간이 ν•„μš”ν•˜λ‹€λ©΄ 더 큰 길이의 배열을 μƒˆλ‘œ λ§Œλ“€κ³  μ΄μ „μ˜ 배열을 λ³΅μ‚¬ν•˜μ—¬μ•Ό ν•œλ‹€. λŒ€ν‘œμ μœΌλ‘  system의 arraycopy() λ©”μ†Œλ“œκ°€ μžˆλ‹€.
int[] oldIntArray = {1,2,3}; //길이가 3인 λ°°μ—΄

int[] newIntArray = new int[5]; //길이가 5인 λ°°μ—΄ 생성

for (int i = 0; i<oldIntArray.length; i++){
    newIntArray[i] = oldIntArray[i];
} //λ°°μ—΄ 볡사

-> System의 arraycopy()λ©”μ†Œλ“œ
System.arraycopy(원본 λ°°μ—΄, 원본 λ°°μ—΄ 볡사 μ‹œμž‘ 인덱슀, μƒˆλ°°μ—΄, μƒˆλ°°μ—΄ 뢙여넣을 인덱슀, 볡사항λͺ©μˆ˜);

System.arraycopy(oldIntArray, 0, newIntArray,0, oldIntArray.length); 

5.10 λ°°μ—΄ ν•­λͺ© λ°˜λ³΅μ„ μœ„ν•œ ν–₯μƒλœ forλ¬Έ

  • ν–₯μƒλœ for문의 경우 증감식 을 μ‚¬μš©ν•˜μ§€ μ•Šκ³ , ν•­λͺ©μ˜ 개수만큼 λ°˜λ³΅ν•œ λ’€ μžλ™μœΌλ‘œ for문을 λΉ μ Έλ‚˜κ°„λ‹€.
for( (2)νƒ€μž…λ³€μˆ˜: (1)λ°°μ—΄){
(3)μ‹€ν–‰λ¬Έ;
}

int[] scores = {10,20,30,40,50};

int sum = 0;

for (int score: scores){
    sum += score;
}

//sum -> 150

5.11 main() λ©”μ†Œλ“œμ˜ String[] λ§€κ°œλ³€μˆ˜ μš©λ„

  • ν„°λ―Έλ„μ—μ„œ ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰ν•  λ•Œ μš”κ΅¬ν•˜λŠ” 값이 μžˆμ„μˆ˜λ„ μžˆλ‹€. μ΄λ•Œ μ‚¬μš©
java sum 10 20 -> 10κ³Ό 20이 메인 λ©”μ†Œλ“œμ˜ String νƒ€μž… λ§€κ°œλ³€μˆ˜λ‘œ μ „λ‹¬λœλ‹€

public static void main(String[] args){..}
μ—¬κΈ°μ—μ„œ 10κ³Ό 20은
String x = args[0];
String y = args[1]; 둜 μ „λ‹¬λœλ‹€. 

5.12 μ—΄κ±°(Enum) νƒ€μž…

  • μ—΄κ±° Enumνƒ€μž…μ˜ 경우 μ œν•œλœ λͺ©λ‘μ—μ„œ 값을 μ‚¬μš© ν• λ•Œ μ‚¬μš©ν•œλ‹€.
  • μš”μΌ(7), μ΄λ‚˜ κ³„μ ˆ(4) 등을 예둜 λ“€μˆ˜ 있고, μ—΄κ±° νƒ€μž…μ˜ 이름은 첫 문자λ₯Ό λŒ€λ¬Έμžλ‘œ ν•˜κ³  캐멀 μŠ€νƒ€μΌλ‘œ μ§€μ–΄μ£ΌλŠ”κ²ƒμ΄ κ΄€λ‘€ 이닀.
Week.java
MemberGrade.java
ProductKind.java

public enum Week {
    MONDAY,
    TUESDAY,
    WEDNESDAY,
    THURSDAY,
    FRIDAY,
    SATURDAY,
    SUNDAY
}