1. μΆμ ν΄λμ€μ μΈν°νμ΄μ€
[λμ€μ μ°Έκ³ ν κ²] https://limkydev.tistory.com/188
(1) μΆμ λ©μλ: λ©μλ 본체λ₯Ό μμ±νμ§ λͺ»ν λ©μλ //ꡬνλΆκ° μλ λ©μλ
-> μ μΈ: abstract λ°ννμ λ©μλμ΄λ¦(); //μΈλ―Έμ½λ‘ νμ, λ©μλ 본체(ꡬνλΆ) μμ
//{..} μ΄λΆλΆ μμ
-> μΆμ λ©μλλ publicμ΄λ protectedλ‘ μ§μ ν μ μμ
(2) μΆμ ν΄λμ€: κ°μ²΄λ₯Ό μμ±νμ§ λͺ»νλ ν΄λμ€
- ꡬν ν΄λμ€λ₯Ό λ§λλ λΆλͺ¨ ν΄λμ€λ‘λ§ μ¬μ©λ λΏ new μ°μ°μλ‘λ μΈμ€ν΄μ€λ₯Ό μμ±νμ§ λͺ»ν¨
// λν ν΄λμ€μ draw()λ©μλλ μμ ν΄λμ€μ draw() λ©μλμ λ¬λ¦¬ (μμ: μ, μ¬κ°ν ..) ꡬ체μ μΈ ννκ° μμ΄ ν¨μ ꡬνμ΄ λΆκ°λ₯ν κ²μ μκ°νμ
-> μ£Όλ‘ μμ κ³μΈ΅μμ μμ λ©€λ²(νλ,λ©μλ)μ μ΄λ¦μ ν΅μΌνλλ° μ¬μ©
- μ μΈ: abstract class ν΄λμ€μ΄λ¦ {..}
-> publicμΌλ‘ μ§μ ν μ μμ
-> νλ, μμ±μ, λ©μλ λ€ μ¬ μ O // super() νΈμΆμ μν΄
-> μ£Όλ‘ νλ μ΄μμ μΆμλ©μλλ₯Ό ν¬ν¨νμ§λ§ μμ΄λ ok
- μΆμ ν΄λμ€μμ μλ μΆμ λ©μλλ λ°λμ μμ ν΄λμ€μ μμν΄μΌ ν¨
-> μΆμ λ©μλλ publicμ΄λ protectedλ‘ μ§μ ν μ μμ
-> λλ¨Έμ§ λ©€λ²λ μ΄λ€ μ κ·Όμ§μ μλ‘λ μ§μ ν μ μμ
- μΆμ ν΄λμ€μ μμ (μμ ν΄λμ€)
-> class μμν΄λμ€μ΄λ¦ extends λΆλͺ¨μΆμν΄λμ€ // λ€μ€μμ X
-> μμν΄λμ€κ° μ€λ²λΌμ΄λ©ν΄μ ꡬνν΄μ€ (extends)
-> μμ ν΄λμ€λ₯Ό ν΅ν΄ ꡬνν΄μ£Όκ³ μμν΄λμ€λ₯Ό ν΅ν΄ κ°μ²΄ μμ±ν¨
//μΆμ ν΄λμ€
abstract class Shape {
double pi = 3.14;
abstract void draw(); //μΆμ λ©μλ
public double findArea() { //ꡬν λ©μλ
return 0.0;
}
}
- μΆμ ν΄λμ€λ λ©€λ² νλλ₯Ό ν¬ν¨ν μ μμ
- μΆμ λ©μλλ 본체({..})κ° μμ
- μΆμ ν΄λμ€λ ꡬν λ©μλ(μΌλ° λ©μλ)λ₯Ό ν¬ν¨ν μ μμ
class Rectangle extends Shape { //μΆμν΄λμ€λ₯Ό ꡬνν μμν΄λμ€
int width, height;
public Rectangle(int width, int height) {
this.width = width;
this.height = height;
}
public void draw() { //λΆλͺ¨-defaultμ΄λ―λ‘ publicμΌλ‘ κ°λ₯(μμ-νλλ§ κ°λ₯)
System.out.println("μ¬κ°νμ 그리λ€.");
}
public double findArea() {
return width * height;
}
}
public class AbstractClassDemo {
public static void main(String[] args) {
// Shape s = new Shape();
Circle c = new Circle(3);
c.draw();
System.out.printf("μμ λμ΄λ %.1f\n", c.findArea());
Rectangle r = new Rectangle(3, 4);
r.draw();
System.out.printf("μ¬κ°νμ λμ΄λ %.1f\n", r.findArea());
}
}
- Shape ν΄λμ€λ μΆμ ν΄λμ€μ΄λ―λ‘ newμ°μ°μ(λλ μμ±μ)λ₯Ό μ¬μ©ν΄ κ°μ²΄λ₯Ό μμ±ν μ μμ
(1) μΈν°νμ΄μ€: ν΄λμ€ κ°μ μνΈμμ©νλ κ·κ²©μΌλ‘, μ¬μ© λ°©λ²μ΄ κ°μ ν΄λμ€λ₯Ό λ§λλ κΈ°μ
- μ μΈ: interface μΈν°νμ΄μ€μ΄λ¦ {...} //νλ, μμ±μ, λ©μλ λ€ μ¬ μ O
- μΈν°νμ΄μ€μ ꡬ쑰
-> νλ: μμλ§ κ°λ₯ (μμ: public static final -> μλ΅ κ°λ₯)
-> λ©μλ: abstract, default, static, private λ€ κ°λ₯ (κΈ°λ³Έμ public abstract -> μλ΅ κ°λ₯)
//λ©μλ λ€ κ°λ₯ν건 JDK9λΆν°
// ꡬνλΆκ° μκ³ , μ κ·Ό μ§μ μ μλ΅λμ΄ μλ λ©μλ = public abstract λ©μλ
// ex. int MAX = 10; = public static final int MAX = 10;
// ex. void sayHello(); = public abstract void sayHello();
- μΈν°νμ΄μ€ ꡬν (ꡬν ν΄λμ€)
-> class μμν΄λμ€ implements λΆλͺ¨μΈν°νμ΄μ€ {..}
-> class μμν΄λμ€ implements λΆλͺ¨μΈν°νμ΄μ€1, λΆλͺ¨μΈν°νμ΄μ€2{..}
// μΈν°νμ΄μ€- λ€μ€ ꡬν κ°λ₯ (ꡬνμ μμμ΄λ κ±°μ λκ°μ)
- μΈν°νμ΄μ€μ μμ (μμ μΈν°νμ΄μ€) // λ€μ λ λμ΄
-> interface μμμΈν°νμ΄μ€ extends λΆλͺ¨μΈν°νμ΄μ€ {..}
-> interface μμμΈν°νμ΄μ€ extends λΆλͺ¨μΈν°νμ΄μ€1, λΆλͺ¨μΈν°νμ΄μ€2 {..}
// μΈν°νμ΄μ€ - λ€μ€ μμ κ°λ₯
- μΈν°νμ΄μ€μ μ₯μ
-> μΈν°νμ΄μ€λ₯Ό μ€μνλ©΄ ν΅ν©μ μ κ²½ μ°μ§ μκ³ , λ€μν ννλ‘ μλ‘μ΄ ν΄λμ€λ₯Ό κ°λ°ν μ μλ€
-> μλ°λ ν΄λμ€μ λ€μ€ μμμ μ§μνμ§ μμ§λ§, μΈν°νμ΄μ€λ‘ λ€μ€ μμ ν¨κ³Όλ₯Ό κ°μ μ μΌλ‘ μ»μ μ μλ€.
+) class μμν΄λμ€ extends λΆλͺ¨ν΄λμ€ implements λΆλͺ¨μΈν°νμ΄μ€1, λΆλͺ¨μΈν°νμ΄μ€2{..} κ°λ₯
// ν΄λμ€λ μμ 1λ²λ§ κ°λ₯, κ·Έλ¬λ μΈν°νμ΄μ€ ꡬνμ μ¬λ¬ κ° κ°λ₯
#1)
// μΈν°νμ΄μ€ A
interface A {
method1(); //ꡬνλΆX-> μΆμ λ©μλ
method2();
}
// μΈν°νμ΄μ€ Aλ₯Ό ꡬνν ꡬν ν΄λμ€ C1
class C1 implements A {
method1() {..}
}
// μΆμν΄λμ€ νλλ₯Ό ꡬννμ§ μμκΈ° λλ¬Έμ κ·Έλλ‘ μ¬μ©ν μ μμ (method2())
// μΈν°νμ΄μ€ Aλ₯Ό ꡬνν ꡬν ν΄λμ€ D1
class D1 implements A {
method1(){..}
method2(){..}
}
//method2()λ ꡬνν¨ -> μ¬μ©κ°λ₯
#2)μ
// μΈν°νμ΄μ€ A
interface A {
method1();
method2(){...} //default λ©μλ (ꡬνλΆλ μμ§λ§, μ κ·Ό μ§μ μκ° μμ = default)
}
// μΈν°νμ΄μ€ Aλ₯Ό ꡬνν ꡬν ν΄λμ€ C1
class C1 implements A {
method1(){..}
}
//method2λ μΆμλ©μλκ° μλκΈ° λλ¬Έμ ꡬννμ§ μμλ λ¨ -> μ¬μ© κ°λ₯
// μΈν°νμ΄μ€ Aλ₯Ό ꡬνν ꡬν ν΄λμ€ C1
class D1 implements A {
method1(){...}
method2(){...}
}
//method2()λ₯Ό μΈν°νμ΄μ€μμ μμλ°μ μ€λ²λΌμ΄λ© ν΄μ€
- λν΄νΈ λ©μλλ μ€λ²λΌμ΄λ© λ μ μμ§λ§, μ μ λ©μλλ μ€λ²λΌμ΄λ© λ μ μλ€.
// μ€λ²λΌμ΄λ©: μμκ΄κ³- μμμμ λ€μ μ μ (λΆλͺ¨κΊΌλ₯Ό λ΄κ»λ‘ λ§λ λ€!λ λλ)
// μΆμλ©μλλ₯Ό μμν΄λμ€μμ ꡬννλ κ²λ μ€λ²λΌμ΄λ©μ
- λν΄νΈ λ©μλλ μΈμ€ν΄μ€ λ©μλμ΄λ―λ‘ κ°μ²΄λ₯Ό μμ±ν ν νΈμΆνμ§λ§, μ μ λ©μλλ μΈν°νμ΄μ€λ‘ μ§μ νΈμΆνλ€.
- μΈν°νμ΄μ€ vs μΆμ ν΄λμ€
λΆλ₯ | μΈν°νμ΄μ€ | μΆμν΄λμ€ |
ꡬν λ©μλ | ν¬ν¨ λΆκ°(λ¨, λν΄νΈ λ©μλμ μ μ λ©μλλ μμΈ0) | ν¬ν¨ κ°λ₯ |
μΈμ€ν΄μ€ λ³μ | ν¬ν¨ λΆκ°λ₯ | ν¬ν¨ κ°λ₯ |
λ€μ€ μμ | κ°λ₯ | λΆκ°λ₯ |
λν΄νΈ λ©μλ | μ μΈ κ°λ₯ | μ μΈ λΆκ°λ₯ |
μμ±μμ main() | μ μΈ λΆκ°λ₯ | μ μΈ κ°λ₯ |
μμμμμ λΆλͺ¨ | μΈν°νμ΄μ€ | μΈν°νμ΄μ€, μΆμ ν΄λμ€ |
μ κ·Ό λ²μ | λͺ¨λ λ©€λ²λ₯Ό κ³΅κ° | μΆμ λ©μλλ₯Ό μ΅μν μμμκ² κ³΅κ° |
2. μΈν°νμ΄μ€μ μμ
(1) μΈν°νμ΄μ€ μμ //μμ - λΆλͺ¨κΊΌ μ¬μ©
- interface μμμΈν°νμ΄μ€ extends λΆλͺ¨μΈν°νμ΄μ€{..}
- interface μμμΈν°νμ΄μ€ extends λΆλͺ¨μΈν°νμ΄μ€1, λΆλͺ¨μΈν°νμ΄μ€2{..}
-> μΈν°νμ΄μ€λ λ€μ€ μμ κ°λ₯ //μμν μΈν°νμ΄μ€κ° μ¬λ¬κ°λΌλ©΄ μΌν(,)λ‘ μ°κ²°νλ€
(2) μΈν°νμ΄μ€ ꡬν
- class ν΄λμ€μ΄λ¦ implements μΈν°νμ΄μ€μ΄λ¦ {..}
- class μμν΄λμ€ implements λΆλͺ¨μΈν°νμ΄μ€1, λΆλͺ¨μΈν°νμ΄μ€2{..}
-> μΈν°νμ΄μ€λ λ€μ€ ꡬν κ°λ₯ //ꡬνν μΈν°νμ΄μ€κ° μ¬λ¬κ°λΌλ©΄ μΌν(,)λ‘ μ°κ²°νλ€
+) class μμν΄λμ€ extends λΆλͺ¨ν΄λμ€ implements λΆλͺ¨μΈν°νμ΄μ€1, λΆλͺ¨μΈν°νμ΄μ€2{..} κ°λ₯
+) ν΄λμ€λ λ€μ€μμ λΆκ°λ₯μΈκ±° μμ§λ§κΈ°!
<μ 리>
* μμ- ν΄λμ€λ ν΄λμ€λΌλ¦¬, μΈν°νμ΄μ€λ μΈν°νμ΄μ€λΌλ¦¬ μμ (μμμ κ°μμ λ€λΌλ¦¬λ§!)
* ꡬν- μΈν°νμ΄μ€λ₯Ό ν΄λμ€λ‘ ꡬν κ°λ₯ (ν΄λμ€λ μΈν°νμ΄μ€λ‘ ꡬν λΆκ°λ₯) //λΉμ°ν¨
(3) μΈν°νμ΄μ€μ μμ
interface Coin {
int PENNY = 1, NICKEL = 5, DIME = 10, QUARTER = 25;
}
public class Coin1Demo {
public static void main(String[] args) {
System.out.println("Dimeμ " + Coin.DIME + "μΌνΈμ
λλ€.");
}
}
- Coin μΈν°νμ΄μ€μμ λ³μ(νλ)κ° μμλ‘ μ΄κΈ°νλμ΄μμ
//μΈν°νμ΄μ€μ νλλ μμλ‘λ§ κ°λ₯νλ―λ‘ λ¬Έμ μμ
- Coin.DIME
-> μΈν°νμ΄μ€μ νλ(μμ) μ κ·Ό λ°©λ²: μΈν°νμ΄μ€μ΄λ¦.νλλͺ
public class Coin2Demo implements Coin {
public static void main(String[] args) {
System.out.println("Dimeμ " + DIME + "μΌνΈμ
λλ€.");
}
}
-> ν΄λμ€ Coin2Demoλ Coin μΈν°νμ΄μ€λ₯Ό ꡬνν¨ (implements)
// Coin μΈν°νμ΄μ€κ° μΆμλ©μλ ν¬ν¨νμ§ μμΌλ―λ‘ λ©μλ ꡬνν νμμμ΄ κ·Έλ₯ μ¬μ©νλ©΄ λ¨
-> Coin μΈν°νμ΄μ€μ ꡬν ν΄λμ€μ΄λ―λ‘ μμλ₯Ό μ§μ μ¬μ©ν μ μμ
// μλλ ν΄λμ€.μμ but, 'ν΄λμ€.' κ΅³μ΄ μν΄λ OK (ꡬν ν΄λμ€ λ΄λΆμ΄κΈ° λλ¬Έ)
(4) Comparable μΈν°νμ΄μ€ : κ°μ²΄λ₯Ό λΉκ΅νκΈ° μ°ν κ·κ²©μΌλ‘ μ¬μ©λλ μΈν°νμ΄μ€
// κΈ°λ³Έμ μΌλ‘ μ 곡 (λ°λ‘ μ μΈν νμX) ??? λ§λ
public interface Comparable {
int compareTo(Object other);
}
- compareTo(): λ€λ₯Έ κ°μ²΄λ³΄λ€ ν¬λ©΄ μμ, λμΌνλ©΄ 0, μμΌλ©΄ μμλ₯Ό λ°νν¨ // μ₯ μΆμλ©μλλΌλ©°..?????
-> compareTo()λ μΆμλ©μλμ (ꡬνλΆ X)
- Object ν΄λμ€: Object ν΄λμ€λ μ΅μμ ν΄λμ€μ (μ μΊμ€ν κ°λ₯)
class Circle implements Comparable {
double radius;
public Circle(double radius) {
this.radius = radius;
}
@Override
public int compareTo(Object o) {
Circle c = (Circle) o;
if(this.radius > c.radius) return 1;
else if (this.radius == c.radius) return 0;
else return -1;
}
public class CircleDemo {
public static void main(String[] args) {
Circle c1 = new Circle(5.0);
Circle c2 = new Circle(6.0);
if (c1.compareTo(c2) > 0)
System.out.println("첫 λ²μ§Έ μμ΄ λ λ²μ§Έ μλ³΄λ€ ν¬λ€.");
else if (c1.compareTo(c2) == 0)
System.out.println("λ μμ ν¬κΈ°κ° κ°λ€.");
else
System.out.println("첫 λ²μ§Έ μμ΄ λ λ²μ§Έ μλ³΄λ€ μλ€.");
}
}
- Comparable μΈν°νμ΄μ€λ₯Ό ꡬννλ Circle ν΄λμ€
-> Comparable μΈν°νμ΄μ€μ ν¬ν¨λ μΆμ λ©μλ compareTo()λ₯Ό ꡬνν΄μ€μΌ μ¬μ©κ°λ₯ν¨
-> compareTo(): λ€λ₯Έ κ°μ²΄λ³΄λ€ ν¬λ©΄ μμ(1), λμΌνλ©΄ 0, μμΌλ©΄ μμ(-1)λ₯Ό λ°νν¨
- Circle ν΄λμ€μ κ°μ²΄ 2κ° μμ±
-> c1: radius = 5.0
-> c2: radius = 6.0
- compareTo()μ Circle ν΄λμ€λ₯Ό λ°μμ μ μΊμ€ν // Objectλ μ΅μμ ν΄λμ€, λ°λΌμ λͺ¨λ ν΄λμ€κ° λ€ μ¬ μ μμ
-> Object o = c1
- Circle c = (Circle) o; (λ€μ΄ μΊμ€ν )
// Circle ν΄λμ€λ‘ μ μΊμ€ν λ Object ν΄λμ€μ κ°μ²΄(o)λ₯Ό λ€μ Circle ν΄λμ€λ‘ λ€μ΄ μΊμ€ν νμ¬ μ¬μ©νλ€.
-> c1.compareTo(c2) // thisκ° c1(κΈ°μ€), cκ° c2κ° λμ΄ λΉκ΅ν¨
-> this.radius > c.radius
3. μΈν°νμ΄μ€μ ꡬνκ³Ό νμ λ³ν
public interface Controllable {
default void repair() {
System.out.println("μ₯λΉλ₯Ό μ리νλ€.");
}
static void reset() {
System.out.println("μ₯λΉλ₯Ό μ΄κΈ°ννλ€.");
}
void turnOn();
void turnOff();
}
- public μΈν°νμ΄μ€ Controllable
- λν΄νΈ λ©μλ repair()
- μ μ λ©μλ reset()
-> repair()κ³Ό reset()μ μ€λ²λΌμ΄λ© μν΄μ€λ μκ΄X (ν΄λ γ±γ )
// μΆμ λ©μλλ§ μ€λ²λΌμ΄λ© νμμ
- μΆμ λ©μλ turnon(), turnoff() //ꡬνλΆκ° μλ μΆμ λ©μλμ΄λ―λ‘ κ΅¬νν λ λ°λμ μ€λ²λΌμ΄λ© ν΄μ€μΌ ν¨
// μΈν°νμ΄μ€μμ μλ΅- public abstract
public class TV implements Controllable {
@Override
public void turnOn() {
System.out.println("TVλ₯Ό μΌ λ€.");
}
@Override
public void turnOff() {
System.out.println("TVλ₯Ό λλ€.");
}
@Override
public void repair() {
System.out.println("TVλ₯Ό μ리νλ€.");
}
}
- Controllable μΈν°νμ΄μ€λ₯Ό ꡬννλ TVν΄λμ€ (implements)
-> Controllable μΈν°νμ΄μ€μ μ μλ μΆμ λ©μλλ€μ ꡬν ν΄λμ€μμ 무쑰건 ꡬνν΄μ€μΌ ν¨
- turnon()κ³Ό turnoff() μ€λ²λΌμ΄λ© (ꡬν)
-> μΆμ λ©μλμ΄λ―λ‘ μ€λ²λΌμ΄λ© μνλ©΄ μλ¬ λ°μ
-> 무쑰건 publicμ΄μ΄μΌ ν¨
-> μΈν°νμ΄μ€) μΆμ λ©μλ μ κ·Όμ§μ μ μλ΅- public abstract
-> λΆλͺ¨μΈ μΈν°νμ΄μ€λ³΄λ€ μ κ·Όλ²μκ° μ’μΌλ©΄ μλκΈ° λλ¬Έ (μμκ³Ό λΉμ·ν¨)
- repair()μ μ€λ²λΌμ΄λ© ν μ무λ μμ§λ§ ν΄λ μκ΄ μμ (νμλ X, νμμμλ§ ν΄μ£Όλ©΄ λ¨)
public class Computer implements Controllable {
public void turnOn() {
System.out.println("μ»΄ν¨ν°λ₯Ό μΌ λ€.");
}
public void turnOff() {
System.out.println("μ»΄ν¨ν°λ₯Ό λλ€.");
}
@Override
public void repair() {
System.out.println("μ»΄ν¨ν°λ₯Ό μ리νλ€.");
}
}
- controllable μΈν°νμ΄μ€λ₯Ό ꡬννλ Computer ν΄λμ€
- TV ν΄λμ€μ λμΌν¨
//@overrideλ κ·Έλ₯ νλ‘κ·Έλ¨λ΄μμ μΆκ°νλ λ΄κ° μ€λ²λΌμ΄λ©μ μ§μ μμ±νλμ μ°¨μ΄μ (λ΄κ° κ± μ¨μ€λ γ±γ )
public class ControllableDemo {
public static void main(String[] args) {
TV tv = new TV();
Computer com = new Computer();
tv.turnOn();
tv.turnOff();
tv.repair();
com.turnOn();
com.turnOff();
com.repair();
Controllable.reset();
// tv.reset();
// com.reset();
}
}
- TV tv = new TV();
- Computer com = new Computer();
-> μΈν°νμ΄μ€μ ꡬν ν΄λμ€λ€μ κ°μ²΄λ₯Ό μμ±
// μΈν°νμ΄μ€λ κ°μ²΄ μμ±μ λͺ»ν¨
- μ μ λ©μλλ μΈν°νμ΄μ€λ‘ μ§μ νΈμΆν΄μΌ ν¨
- reset()μ μ μ λ©μλμ΄λ―λ‘ κ°μ²΄λ‘ μ κ·Ό λΆκ° (μΈν°νμ΄μ€ μμμ)
-> κ°μ²΄λ‘ μ κ·Όνλ©΄ μ€λ₯
// μλλ μ μ λ©μλλ μμλΆκ°μΈκ±° μμ§λ§κΈ°
(Notebook ν΄λμ€ μΆκ°)
interface Portable {
void inMyBag();
}
public class Notebook extends Computer implements Portable {
public void inMyBag() {
System.out.println("λ
ΈνΈλΆμ κ°λ°©μ μλ€.");
}
public void turnOn() {
System.out.println("λ
ΈνΈλΆμ μΌ λ€.");
}
public void turnOff() {
System.out.println("λ
ΈνΈλΆμ λλ€.");
}
public static void main(String[] args) {
Notebook n = new Notebook();
n.turnOn();
n.turnOff();
n.inMyBag();
}
}
- Portable μΈν°νμ΄μ€
- void inMyBag();
-> ꡬνλΆκ° μλ μΆμ λ©μλμ (public abstract)
-> ꡬννλ ν΄λμ€μμ ꡬν νμν¨ (μνλ©΄ μλ¬)
- class Notebook extends Computer implements Portable{..}
-> Notebook ν΄λμ€λ Computer ν΄λμ€λ₯Ό μμλ°κ³ Portable μΈν°νμ΄μ€λ₯Ό ꡬνν¨
// Computer ν΄λμ€μ Portable μΈν°νμ΄μ€λ₯Ό λ λ€ λ°μμ€λ λλ..
- public void inMyBag() {..}
-> μΆμ λ©μλ ꡬν(μ€λ²λΌμ΄λ©)ν΄μ€
// κ·Έλ₯ μμ ν΄λμ€ λΆλΆμμ λ©μλλ₯Ό μλ‘ μ μνκ±°λ ꡬννλ κ²λ λ€ μ€λ²λΌμ΄λ©μ
- turnon(), turnoff()μ νμμ λ°λΌ μ€λ²λΌμ΄λ© (νμX)
-> μ΄λ―Έ Computer ν΄λμ€μμ ꡬνν΄μ£ΌμκΈ° λλ¬Έμ νμλ X
-> Computer ν΄λμ€μμ Controllable μΈν°νμ΄μ€μ μΆμ λ©μλλ₯Ό ꡬνν λ©μλλ₯Ό μμ μ λ§κ² μ€λ²λΌμ΄λ© ν΄μ€
// Notebook ν΄λμ€λ Computer ν΄λμ€λ₯Ό μμλ°μΌλ―λ‘ Computer ν΄λμ€μ λ©μλλ₯Ό μμλ°μ