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<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
๋ฐ์ํ