Dev/Java

[Java ์‘์šฉ] 4. ์ œ๋„ค๋ฆญ, ์—ด๊ฑฐํ˜•, ์ด๋„ˆํด๋ž˜์Šค

KeyDi 2023. 3. 20. 13:18
728x90

๐Ÿ‘€์œ ์šฉํ•œ ์ •๋ณด

Eclipse ๋‹จ์ถ•ํ‚ค

  • ctrl + h : ํŒŒ์ผ ์ „์ฒด ๊ฒ€์ƒ‰

๐Ÿ’ก13, 14, ์‘์šฉ3์žฅ ํ”ผ๋“œ๋ฐฑ Tip

  • clone() ์žฌ์ •์˜๋Š” ์ฃผ์˜ํ•˜๋ผ
public interface Cloneable {
}
@IntrinsicCandidate
    protected native Object clone() throws CloneNotSupportedException;
๐Ÿ’ก
- clone()์€ Object ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ์ด์ง€๋งŒ, protected๋กœ ๊ตฌํ˜„๋˜์–ด ์žˆ์–ด ๊ทธ๋ƒฅ ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ๋˜์–ด ์žˆ๋‹ค. ๊ธฐ์กด clone()์€ reflectrion ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•œ native๋กœ ๊ตฌํ˜„๋˜์–ด ์žˆ์–ด์„œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ์ƒ์„ฑํ•ด ๋ณต์‚ฌํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ, ์ •์ƒ์ ์ด์ง€ ๋ชปํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ๋ณต์‚ฌํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฐ์ฒด๋ฅผ ๋ณต์‚ฌํ•˜๋ ค๋ฉด clone() ๋ฉ”์„œ๋“œ๋ฅผ ์ง์ ‘ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๋ณต์‚ฌํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ฐ”๊พธ์–ด ๊ตฌํ˜„ํ•˜๋Š”๊ฒƒ์ด ์ข‹๋‹ค. (์ ‘๊ทผ ์ง€์ •์ž : public, ๋ฆฌํ„ด ํƒ€์ž… : ๋ฐ”๊ฟ”์ฃผ๊ธฐ)
๐Ÿ’ก
๊ทธ๋ž˜๋„ ์˜ค๋žœ ์ผ๊ด€๋œ ๊ด€์Šต์„ ๋”ฐ๋ผ Cloneable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ , ์ง์ ‘ clone() ๋ฉ”์„œ๋“œ ๋‚ด๋ถ€๋ฅผ ์ง์ ‘ ๊ฐ์ฒด ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ๋ณต์‚ฌํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•˜์ž.
๐Ÿ’ก
Java Reflection ๋ชจ๋“  ๋ฉ”์†Œ๋“œ, ํ•„๋“œ, ์ƒ์„ฑ์ž ๋“ฑ private๋กœ ์„ ์–ธ๋˜์–ด ์žˆ๋”๋ผ๋„ ๊ฐ’์„ ๋šซ๊ณ  ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

  • SRP(๋‹จ์ผ ์ฑ…์ž„ ์›์น™) ์ค€์ˆ˜
๐Ÿ’ก
๋ชจ๋“  ๊ฐ์ฒด๋Š” ๋‹จ์ผ ์ฑ…์ž„ ๋งŒ์„ ๊ฐ€์ง€๋„๋ก ์„ค๊ณ„ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. ๋งŒ์•ฝ, ํ•ด๋‹น ํด๋ž˜์Šค์— ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๊ณ  ์‹ถ์„ ๋•Œ, ๊ทธ ํด๋ž˜์Šค์— ๊ธฐ๋Šฅ ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ, Arrays()์™€ ๊ฐ™์ด s๋ฅผ ๋ถ™์ด๊ณ  ํ•ด๋‹น ์—ฌ๋Ÿฌ ๊ธฐ๋Šฅ๋“ค์„ ์ œ๊ณตํ•˜๋Š” ํด๋ž˜์Šค๋ฅผ ๋”ฐ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.


๐Ÿ“˜ ์‘์šฉ 4์žฅ ์ œ๋„ค๋ฆญ, ์—ด๊ฑฐํ˜•, ์ด๋„ˆํด๋ž˜์Šค

ํƒ€์ž…์ด ์—†์„ ๋•Œ์˜ ๋ฌธ์ œ์ 

  • ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ ๋‚˜๊ธฐ๊ฐ€ ์‰ฝ๋‹ค
  • IDE๊ฐ€ ์ปดํŒŒ์ผ ์—๋Ÿฌ๋ฅผ ๋ฏธ๋ฆฌ ์ฐพ์„ ์ˆ˜ ์—†๋‹ค.
๐Ÿ’ก
๊ทธ๋ž˜์„œ Object ํด๋ž˜์Šค๋ฅผ ์ฃผ๋กœ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์ง€ ์•Š๋‹ค.

์ œ๋„ค๋ฆญ(Generic)

  • ํƒ€์ž…์„ ๋‚˜์ค‘์— ์›ํ•˜๋Š” ํ˜•ํƒœ๋กœ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ํƒ€์ž… ์•ˆ์ „(type safe) ํšจ๊ณผ
๐Ÿ’ก
์ œ๋„ค๋ฆญ ํƒ€์ž…์„ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด, Object๋ฅผ ๋Œ€์ž…ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ธ์‹ํ•œ๋‹ค.
import java.util.ArrayList;
import java.util.List;

public class Main {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        List list = new ArrayList<>();

        list.add(1);
        list.add("ํ™๊ธธ๋™");
        list.add(null);
        list.add(3.0);
        list.add(true);

        System.out.println(list);
        System.out.println((String) list.get(0) + 10);
    }
}
๐Ÿ’ก
์ œ๋„ค๋ฆญ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  Object type์œผ๋กœ ๊ฐ’์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด, ํ•ด๋‹น ๊ฐ’๋“ค์„ ์ฒ˜๋ฆฌํ•  ๋•Œ ๊ฐœ๋ฐœ์ž์˜ ์˜๋„ํ•˜์— ํƒ€์ž… ๋ณ€ํ™˜ Cast๊ฐ€ ํ•„์š”ํ•˜๊ณ  ์ด๋Š” ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ๋ฅผ ์œ ๋ฐœํ•œ๋‹ค.

์—ด๊ฑฐํ˜• (Enum)

๐Ÿ’ก
์ •ํ•ด ๋‘” ๊ฐ’์„ ๋„ฃ์–ด๋‘˜ ์ˆ˜ ์žˆ๋Š” ํƒ€์ž…

๋กœ๊ทธ์ธ ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ƒ์ˆ˜๋ฅผ ์ •์˜ํ•œ ์˜ˆ

๐Ÿ’ก
์ƒํƒœ์˜ ์ƒ์ˆ˜๋ฅผ ์ •์˜ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์€ ์ƒํƒœ๊ฐ€ ์ถ”๊ฐ€๋  ๊ฒฝ์šฐ else ์ฒ˜๋ฆฌ ๋“ฑ ์ฝ”๋“œ ๋ณ€๊ฒฝ์— ์ทจ์•ฝํ•˜๋‹ค.

enum์„ ์ •์˜ํ•˜์—ฌ ์„ธ ๊ฐ€์ง€ ์ƒํƒœ๋กœ ์ œ์•ฝ์„ ๊ฑด ์ฝ”๋“œ

๐Ÿ’ก
Enum์„ ์ •์˜ํ•˜์—ฌ ๋ฌด์˜๋ฏธํ•œ ์ƒํƒœ ์ˆซ์ž ์ •์˜๊ฐ€ ์•„๋‹Œ, ์›ํ•˜๋Š” ์ƒํƒœ ๊ฐ’ ๋งŒ์„ ์ •์˜ํ•œ๋‹ค. (์ถ”ํ›„ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ํ•ด๋‹น ์ƒํƒœ๋ฅผ ์ •์ˆ˜ ํ˜•ํƒœ๋กœ ๋ฐ”๊พธ์–ด ์ฒ˜๋ฆฌ.) โ†’ ์ด๋Ÿฌํ•œ ์ƒํƒœ ์ฒ˜๋ฆฌ๋Š” ํ•ด๋‹น ์ƒํƒœ์— ๋Œ€ํ•œ ๋ช…ํ™•ํ•œ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด switch-case๋ฌธ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

์ด๋„ˆํด๋ž˜์Šค (Inner class)

  • ํด๋ž˜์Šค ์•ˆ์— ์ •์˜ํ•˜๋Š” ํด๋ž˜์Šค

static ์œ ๋ฌด์˜ ์ฐจ์ด

๐Ÿ’ก
static์ด ์—†์œผ๋ฉด, ๋‚ด๋ถ€ ์ด๋„ˆ ํด๋ž˜์Šค์—์„œ ๋ฐ”๊นฅ ํด๋ž˜์Šค ๋ธ”๋ก ๋ณ€์ˆ˜ ๊ฐ’์„ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ, ๋ธ”๋ก์ด ์ข…๋ฃŒ๋˜์–ด๋„ ๊ณ„์† ์ฐธ์กฐํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ, ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ๊ฐ€ ํ•ด๋‹น ๋ธ”๋ก์„ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ •๋ฆฌํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ๋œ๋‹ค. โ†’ ํด๋ž˜์Šค ์˜์กด ๊ด€๊ณ„๊ฐ€ ์‹ฌํ™”๋˜๊ณ , ์˜์กด์„ฑ ์—ญ์ „ ์›์น™(DIP)์— ์œ„๋ฐฐ๋œ ์ž˜๋ชป๋œ ์„ค๊ณ„์ด๋‹ค. * ๊ตณ์ด Inner Class๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด, static์œผ๋กœ ๋ถ„๋ฆฌ๋œ ๊ตฌ์กฐ๋กœ ์„ ์–ธํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ƒฅ ์“ฐ์ง€๋ง์ž

์ต๋ช…ํด๋ž˜์Šค (anonymous class)

๊ฐ์ฒด๊ฐ€ ๋‹ด๊ธด ์ปฌ๋ ‰์…˜์„ ์ •๋ ฌํ•˜๊ธฐ

  • Collections.sort()
๐Ÿ’ก
์ •๋ ฌ ๋Œ€์ƒ ํด๋ž˜์Šค์— ๋Œ€ํ•ด Comparable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ โ†’ compareTo() ์˜ค๋ฒ„๋ผ์ด๋“œ ๋ฐฉ๋ฒ• โ†’ ๋งค ๋ฒˆ ์ •๋ ฌ ๋Œ€์ƒ๊ณผ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์ˆ˜์ •์ด ํ•„์š”ํ•˜๋‹ค.

  • list.sort() - Comparator ๊ตฌํ˜„ํ•˜์—ฌ List.sort(new Comparator())
๐Ÿ’ก
List<Student> students = new ArrayList<>(); students.sort(); โ†’ ์ผ๋ฐ˜์ ์ธ Wrapper Class๊ฐ€ ์•„๋‹Œ, ์‚ฌ์šฉ์ž๊ฐ€ ์ •์˜ํ•œ ํด๋ž˜์Šค ํƒ€์ž…์˜ List๋Š” ์ •๋ ฌ ๊ทœ์น™์ด ์ •์˜๋œ Comparator() ์ธ์Šคํ„ด์Šค๋ฅผ ์ธ์ž๋กœ ์ฃผ์–ด์•ผ ํ•œ๋‹ค.
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

class StudentIdAscComparator implements Comparator<Student> {
    @Override
    public int compare(Student o1, Student o2) {
        return Integer.compare(o1.getId(), o2.getId());
    }
}

class StudentNameAscComparator implements Comparator<Student> {
    @Override
    public int compare(Student o1, Student o2) {
        return o1.getName().compareTo(o2.getName());
    }
}

public class Main {
    public static void main(String[] args) {
        List<Student> students = new ArrayList<>();
        // ์‚ฝ์ž… ์ƒ๋žต
        students.sort(new StudentIdAscComparator());
    }
}
๐Ÿ’ก
์ •๋ ฌ ๊ทœ์น™์˜ ํด๋ž˜์Šค๋Š” Comparator<>์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๊ณ , compare ๋ฉ”์„œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋“œ ํ•ด์•ผ ํ•œ๋‹ค. โ—๊ฐ ์ •๋ ฌ ๊ทœ์น™์€ Primitive Wrapper Type์— ์ •์˜๋œ Compare(), compareTo() ๋ฉ”์„œ๋“œ๋ฅผ ํ™œ์šฉํ•˜๋ฉด ์ข‹๋‹ค!

์ต๋ช… ํด๋ž˜์Šค

์œ„์™€ ๊ฐ™์ด ๋งค๋ฒˆ ์ •๋ ฌ ๊ทœ์น™์„ ์ •์˜ํ•œ ํด๋ž˜์Šค๋“ค์„ ๋งŒ๋“ค์–ด ๋‘๊ณ  ์‚ฌ์šฉํ•˜๊ธฐ ๋ฒˆ๊ฑฐ๋กญ๊ฑฐ๋‚˜, ๊ทธ ํด๋ž˜์Šค๋ฅผ ํ•œ๋ฒˆ๋งŒ ์‚ฌ์šฉํ•˜๊ณ  ์•ˆ์“ธ ๊ฒฝ์šฐ

โ†’ ์ต๋ช… ํด๋ž˜์Šค ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

public abstract class Asset {}
public class Main {
    public static void main(String[] args) {
				Asset asset = new Asset("aaa", 100) {};
    }
}
๐Ÿ’ก
์ต๋ช… ํด๋ž˜์Šค๋ฅผ ํ†ตํ•ด ์ถ”์ƒ ํด๋ž˜์Šค ๋ฐ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋‹จ, ์ต๋ช… ํด๋ž˜์Šค๋ฅผ ํ†ตํ•ด ๊ตฌํ˜„๋œ ์ถ”์ƒ ํด๋ž˜์Šค์™€ ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋ฉ”์„œ๋“œ ๋‚ด์šฉ์˜ ์ƒ๋ช…์ฃผ๊ธฐ๋Š” ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒ์„ฑ๋œ ์งํ›„ ํ•œ๋ฒˆ๋งŒ ์‹คํ–‰๋˜๊ณ  ์‚ฌ๋ผ์ง„๋‹ค.

students.sort(new Comparator<Student>(){
		@Override
		public int compare(Student o1, Student o2) {
			return o1.getName().compareTo(o2.getName());
		}
});
๐Ÿ’ก
์œ„์™€ ๊ฐ™์ด ๋ฏธ๋ฆฌ ์ •์˜ํ•œ ์ •๋ ฌ ๊ทœ์น™ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ, ์ฆ‰ํฅ์ ์œผ๋กœ ์ต๋ช… ํด๋ž˜์Šค๋ฅผ ํ†ตํ•ด ์ •๋ ฌํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ, SRP๋ฅผ ๋”ฐ๋ฅธ ์ข‹์€ ์„ค๊ณ„๋Š” ๊ฐ Comparator ๋ฐฉ์‹์„ ์ •์˜ํ•œ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด ๋‘๊ณ  ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์ด ๋” ์ข‹์€ ์„ค๊ณ„์ด๋‹ค. ์ฆ‰, ์„ค๊ณ„์ ์œผ๋กœ ์ต๋ช… ํด๋ž˜์Šค์˜ ์‚ฌ์šฉ์€ ์ง€์–‘ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

๐Ÿ“์—ฐ์Šต ๋ฌธ์ œ

4-1

package Exam;

import java.util.Objects;

public class StrongBox<T> {
    private T data;
    
    public void StringBox(T data){
        this.data = data;
    }
    
    public T get() {
        return data;
    }
    
    public void put(T data) {
        this.data = data;
    }

    @Override
    public int hashCode() {
        return Objects.hash(data);
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        StrongBox other = (StrongBox) obj;
        return Objects.equals(data, other.data);
    }

    @Override
    public String toString() {
        return "StrongBox [data=" + data + "]";
    }

}

4-2

package Exam;

import java.util.Objects;

public class StrongBox<T> {
    private T data;
    private KeyType keyType;
    private int usedCount;

    public StrongBox(T data, KeyType keyType) {
        this.data = data;
        this.keyType = keyType;

        switch (this.keyType) {
            case PADLOCK:
                this.usedCount = 1024;
                break;
            case BUTTON:
                this.usedCount = 10000;
                break;
            case DIAL:
                this.usedCount = 30000;
                break;
            case FINGER:
                this.usedCount = 1000000;
        }
    }

    public StrongBox(KeyType keyType) {
        this(null, keyType);
    }

    public T get() {
        usedCount--;
        if (this.usedCount > 0) {
            return null;
        } else {
            return data;
        }
    }

    public void put(T data) {
        this.data = data;
    }

    @Override
    public int hashCode() {
        return Objects.hash(data);
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        StrongBox other = (StrongBox) obj;
        return Objects.equals(data, other.data);
    }

    @Override
    public String toString() {
        return "StrongBox [data=" + data + "]";
    }
}
package Exam;

public enum KeyType {
    PADLOCK,
    BUTTON,
    DIAL,
    FINGER
}
package Exam;

public class Gold {
    private String name;
    private int price;

    public Gold(String name, int price) {
        this.name = name;
        this.price = price;
    }

    @Override
    public String toString() {
        return "Gold [name=" + name + ", price=" + price + "]";
    }

}
package Exam;

public class Main {

    public static void main(String[] args) {
        Gold gold = new Gold("3๋ˆ ๊ธˆ", 10000000);

        StrongBox<Gold> strongBox = new StrongBox<Gold>(KeyType.PADLOCK);
        strongBox.put(gold);

        for (int i = 0; i < 1024; i++) {
            Gold getGold = strongBox.get();

            if (getGold != null) {
                System.out.println(getGold);
            }
        }
    }
}



Uploaded by N2T

728x90
๋ฐ˜์‘ํ˜•