๐Ÿš€ ๊ฐ์ฒด์ง€ํ–ฅ ์„ธ๊ณ„๋กœ

์•™์ง€๋™ยท2025๋…„ 2์›” 28์ผ
11

JAVA

๋ชฉ๋ก ๋ณด๊ธฐ
3/6
post-thumbnail

๐Ÿ“š ๊ฐ์ฒด๋ž€?

  • ์‹ค์ œ๋กœ ์กด์žฌํ•˜๋Š”๊ฒƒ์„ ๋œป ํ•จ
  • ๋ง์…ˆ, ๋บ„์…ˆ ๋“ฑ ๋ˆˆ์— ๋ณด์ด์ง€ ์•Š์€ ๊ฒƒ๋“ค๋„ ๋ฌดํ˜•์˜ ๊ฐ์ฒด์ž„!
  • cํŒŒ๋ž€๋”ฑ์ง€ ํด๋ž˜์Šค ์ค€๋น„๋˜์–ด ์žˆ๋‹ค๋ฉด ํด๋ž˜์Šค๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์—ฌ๋Ÿฌ ๊ฐ์ฒด๋“ค์„ ๋งŒ๋“ค์–ด ๋‚ผ์ˆ˜ ์žˆ์Œ!( ๋‚˜๋งŒ์•Œ์•„๋“ค์„๋“ฏ..)

์‚ฌ์ง„์ฒ˜๋Ÿผ Person.classr ๊ฐ์ฒด ํŒŒ์ผ์ด ์žˆ๋‹ค๋ฉด ํด๋ž˜์Šค๋Š” ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๊ธฐ์œ„ํ•œ ์„ค๊ณ„๋„์ž„!

1๏ธโƒฃ Person.classr ํด๋ž˜์Šค ํŒŒ์ผ

public class Person() { 
		...
}

2๏ธโƒฃ new ํ‚ค์›Œ๋“œ๋กœ ๊ฐ์ฒด ์ƒ์„ฑ, ์ด๊ณผ์ •์„ ์ธ์Šคํ„ด์Šคํ™”๋ผ๊ณ  ํ‘œํ˜„ํ•จ

public class Main {

		public static void main(String[] args) {
				Person personA = new Person(); // โœ… ์ฒซ๋ฒˆ์งธ ๊ฐ์ฒด ์ƒ์„ฑ 
				Person personB = new Person(); // โœ… ๋‘๋ฒˆ์งธ ๊ฐ์ฒด ์ƒ์„ฑ
		}
}

๐Ÿ“™ ํด๋ž˜์Šค / ์„ค๊ณ„๋„ ๊ตฌ์กฐ

  • ํด๋ž˜์Šค๊ตฌ์กฐ๋Š” ์†์„ฑ,์ƒ์„ฑ์ž,๊ธฐ๋Šฅ ๋ถ€๋ถ„์œผ๋กœ ๋‚˜๋ˆ„์–ด์ง (์†,์ƒ,๊ธฐ)
class ํด๋ž˜์Šค {

		// 1. ์†์„ฑ  ๋‚˜์ด ์ด๋ฆ„ ์ฃผ์†Œ 
		
		// 2. ์ƒ์„ฑ์ž
		
		// 3. ๊ธฐ๋Šฅ
}

โœ”๏ธ ์†์„ฑ

  • ์†์„ฑ์€ ํŠน์ง•์„ ์ž‘์„ฑํ•˜๋Š” ๊ณณ
  • ๋‹น์—ฐํžˆ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด์•ผ ์†์„ฑ์— ์ ‘๊ทผํ• ์ˆ˜์žˆ๊ฒ ์ง€~?ใ…Žใ…Ž
  • ์‚ฌ๋žŒ์„ ์†์„ฑ์œผ๋กœ ๋“ค๋ฉด ๋‚˜์ด,์ด๋ฆ„,์ฃผ์†Œ ๊ณ„์‚ฐ๊ธฐ๋กœ ์˜ˆ๋ฅผ๋“ค๋ฉด ํ˜„์žฌ๊ฐ’, ์ด์ „๊ฐ’, ์—ฐ์‚ฐ์ž ๋“ฑ ํ•ด๋‹นํ•จ
  • ํ”„๋กœํผํ‹ฐ(property), ํ•„๋“œ(field)๋ผ๊ณ  ์นญํ•œ๋‹คํ•จ..
public class Main {

		public static void main(String[] args) {
		
				// 1. ๊ฐ์ฒด ์ƒ์„ฑ
				Person personA = new Person(); 
				Person personB = new Person(); 
				
				//  โœ… ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด ์ ‘๊ทผ personA ์˜ name
				System.out.println(personA.name);

				// โœ… ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด ์ ‘๊ทผ personB ์˜ name
				System.out.println(personB.name);
		}
}

โœ”๏ธ์ƒ์„ฑ์ž

  • ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๋•Œ ์‚ฌ์šฉํ•œ๋‹ค
  • ๊ฐ์ฒด๋ฅผ ์–ด๋–ป๊ฒŒ ๋งŒ๋“ค์ง€ ์ •์˜ํ•ด๋†“๋Š”๊ฒƒ(์กฐ๋ฆฝ์„ค๋ช…์„œ ๋Š๋‚Œ์ด๋ผ๋ณด๋ฉด๋Ž…)
  • ์ƒ์„ฑ์ž๊ฐ€ ์—†์œผ๋ฉด ํด๋ž˜์Šค๋ฅผ ๊ฐ์ฒดํ™”๋ฅผ ์‹œํ‚ฌ์ˆ˜ ์—†์Œ(์กฐ๋ฆฝ๋ถˆ๊ฐ€/ํŒฅ์—†๋Š” ๋‹จํŒฅ๋นต๋Š๋‚Œ์ด๋ผ๋ด„)
  • ์‚ฌ์‹ค ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ๊ธฐ๋ฒˆ ์ƒ์„ฑ์ž๋Š” ์ž๋™์œผ๋กœ ์ถ”๊ฐ€๋˜๋Š”๊ฑฐ๊ฑฐ๋“ฑ ๋ฉ”๋กฑ๐Ÿ˜

์ด๋ฆ„ ๋‚˜์ด๋งŒ์„ ๊ฐ€์ง€๊ณ ์žˆ๋Š” ๊ฐ์ฒด๋ฅผ ๋งŒ๋‹จ๋‹ค๋ฉด ์•„๋ž˜ ๊ฐ์ฒด ์ƒ์„ฑํ•˜๋ฉด๋Œ (address ์ œ์™ธ์ž„ ์ด๊ฑด ๋ฌผ์–ด๋ด์•ผ๊ฒ ๋‹ค)

1๏ธโƒฃ ํด๋ž˜์Šค ๊ฐ์ฒด ์ƒ์„ฑ

public class Person {
		String name;
		int age;
		String address;
		
		Person() {} // โŒ ๊ธฐ๋ณธ์ƒ์„ฑ์ž ์ œ๊ฑฐ!!!
		
		Person(String name, int age) { // โœ… ์ƒˆ๋กœ์šด ์ƒ์„ฑ์ž(์กฐ๋ฆฝ์„ค๋ช…์„œ)
				this.name = name;
				this.age = age;
		}
}

2๏ธโƒฃ Main ์ด์ „์ฝ”๋“œ ์—๋Ÿฌ๋ฐœ์ƒ
โš ๏ธ this ํ‚ค์›Œ๋“œ๋Š” ๊ฐ์ฒด ์ž์‹ ์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ํ‚ค์›Œ๋“œ ์ฆ‰ ํ˜„์žฌ ์‹คํ–‰์ค‘์ธ ๊ฐ์ฒด๋ฅผ ์˜๋ฏธํ•จ.

public class Main {

		public static void main(String[] args) {
				Person personA = new Person(); // โŒ ์—๋Ÿฌ๋ฐœ์ƒ
				Person personB = new Person(); // โŒ ์—๋Ÿฌ๋ฐœ์ƒ
		}
}

3๏ธโƒฃ ๋‚˜ ๋ฐ•์ง€์—ฐ ๋‹นํ™ฉ๋…ธ๋…ธ Main(tring name, int age)๊ฐ’ ์Šฅ ๋„ฃ์–ด์ฃผ๊ธฐ

public class Main {

public static void main(String[] args) {
Person personA = new Person("gygim", 10); // โœ… ์กฐ๋ฆฝ์„ค๋ช…์„œ ์ค€์ˆ˜
Person personB = new Person("Steve", 5);  // โœ… ์กฐ๋ฆฝ์„ค๋ช…์„œ ์ค€์ˆ˜
		}
}

โœ”๏ธ ๊ธฐ๋Šฅ(๋งค์„œ๋“œ)

  • ์ƒ์ƒํ•˜๋Š” ๋ชจ๋“ ๊ฒƒ์„ ๊ตฌํ˜„ํ• ์ˆ˜์žˆ๋‹ค. (์•ผ!๋„ˆ๋‘๊ฟˆ์„ ํŽผ์น ์ˆ˜์ด์’€!)
    โ†’ ์ž๊ธฐ์†Œ๊ฐœ, ๋”ํ•˜๊ธฐ, ๊ฑท๊ธฐ ๊ธฐ๋Šฅ ๋“ฑ
  • ๋งค์„œ๋“œ๋ฅผ ํ™œ์šฉํ•˜๋Š”๊ฒƒ์ด ๊ฐ์ฒด์˜ ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•˜๋Š”๊ฒƒ์ด๋ผ ๋ณผ์ˆ˜์žˆ์›€
  • ํด๋ž˜์Šค์™€ ๊ด€๋ จ๋œ ๊ธฐ๋Šฅ์„ ์ž‘์„ฑํ•˜๋Š”๊ฒŒ ์ข‹์Œ ์–ด์ฒ˜๊ตฌ๋‹ˆ ๋ถˆ๊ฐ€์•ผ

1๏ธโƒฃ ํด๋ž˜์Šค ๊ฐ์ฒด์ƒ์„ฑ

class Person {
		...
		
		// โœ… ์‚ฌ๋žŒ์˜ ์†Œ๊ฐœ ๊ธฐ๋Šฅ
		void introduce() {
				System.out.println("์•ˆ๋…•ํ•˜์„ธ์š”.");
				System.out.println("๋‚˜์˜ ์ด๋ฆ„์€ " + this.name + "์ž…๋‹ˆ๋‹ค.");
				System.out.println("๋‚˜์ด๋Š” " + this.age + "์ž…๋‹ˆ๋‹ค.");
		}
		
		// โœ… ์‚ฌ๋žŒ์˜ ๋”ํ•˜๊ธฐ ๊ธฐ๋Šฅ
		int sum(int a, int b) {
				int result = a + b;
				return result;
		}
}

2๏ธโƒฃ Main

public class Main {

		public static void main(String[] args) {
				Person personA = new Person("gygim", 10);
				personA.introduce(); // โœ… personA ๊ฐ์ฒด introduce() ํ˜ธ์ถœ
				
				Person personB = new Person("Steve", 5);
		}
}

โš ๏ธ ํด๋ž˜์Šค์™€ ๊ฐ์ฒด ์˜ˆ์‹œ ์ฝ”๋“œ

๐Ÿ“Œ Person ํด๋ž˜์Šค (์„ค๊ณ„๋„)
class Person {
    // ์†์„ฑ 
    String name;
    int age;

    // ์ƒ์„ฑ์ž 
    Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // ๊ธฐ๋Šฅ (๋ฉ”์„œ๋“œ)
    void introduce() {
        System.out.println("\n์•ˆ๋…•ํ•˜์„ธ์š”.");
        System.out.println("๋‚˜์˜ ์ด๋ฆ„์€ " + this.name + "์ž…๋‹ˆ๋‹ค.");
        System.out.println("๋‚˜์ด๋Š” " + this.age + "์‚ด์ž…๋‹ˆ๋‹ค.");
    }

    //  ๋‘ ์ˆ˜๋ฅผ ๋”ํ•˜๋Š” ๊ธฐ๋Šฅ (๋ฉ”์„œ๋“œ)
    int sum(int a, int b) {
        return a + b;
    }
}

 ๐Ÿš€ ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰์„ ์œ„ํ•œ Main ํด๋ž˜์Šค
public class Main {
    public static void main(String[] args) {
        // ์ฒซ ๋ฒˆ์งธ ์‚ฌ๋žŒ ์ƒ์„ฑ
        Person personA = new Person("gygim", 10);
        personA.introduce();  // ์ž๊ธฐ์†Œ๊ฐœ ์ถœ๋ ฅ

        //  ๋‘ ๋ฒˆ์งธ ์‚ฌ๋žŒ ์ƒ์„ฑ
        Person personB = new Person("Steve", 5);
        personB.introduce();  // ์ž๊ธฐ์†Œ๊ฐœ ์ถœ๋ ฅ

        // ๊ฐ์ฒด๋ฅผ ์ด์šฉํ•ด ๋”ํ•˜๊ธฐ ๊ธฐ๋Šฅ ์‚ฌ์šฉ
        int result = personA.sum(3, 4);
       System.out.println("\n3 + 4์˜ ๊ฒฐ๊ณผ๋Š” " + result + "์ž…๋‹ˆ๋‹ค.");
    }
}

๐Ÿ“’ ๊ฒŒํ„ฐ์™€์„ธํ„ฐ(ํŒจํŠธ์™€๋งคํŠธ)

  • ๊ฒŒํ„ฐ๋Š” ํด๋ž˜์Šค์˜ ์†์„ฑ์„ ๊ฐ€์ ธ์˜ฌ๋•Œ ์‚ฌ์šฉ๋˜๋Š” ๊ธฐ๋Šฅ
  • ์ฆ‰ ํด๋ž˜์Šค์˜ ์†์„ฑ(ํ•„๋“œ)์„ ์™ธ๋ถ€์—์„œ ์ฝ์„ ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๋ฉ”์„œ๋“œ
  • ๋ณดํ†ต getํ•„๋“œ๋ช…() ํ˜•ํƒœ๋กœ ์ •์˜ํ•˜๋ฉฐ, ํ•ด๋‹น ์†์„ฑ ๊ฐ’์„ ๋ฐ˜ํ™˜(return)ํ•ด์•ผํ•จ
  • ๊ณ ๋ƒฅ getName(), getAge(), getAddress() ์ฒ˜๋Ÿผ ํด๋ž˜์Šค์— ์ถ”๊ฐ€ํ•˜๋ฉด ๊ฒŒํ„ฐ๊ฐ€ ์™•์„ฑ

๐Ÿ’ก ๊ฒŒํ„ฐ๋Š” ์™œ ์‚ฌ์šฉํ•ด์•ผํ•˜์ง€?

1๏ธโƒฃ ๊ฐ์ฒด์˜ ํ•„๋“œ๋ฅผ private์œผ๋กœ ๋ณดํ˜ธ(์บก์Šํ™”) โ†’ ์ง์ ‘ ์ ‘๊ทผ ๋ฐฉ์ง€! ๐Ÿšซ
2๏ธโƒฃ ํ•„๋“œ ๊ฐ’์„ ๊ฐ€์ ธ์˜ฌ ๋•Œ ์ถ”๊ฐ€ ๋กœ์ง์„ ๋„ฃ์„ ์ˆ˜ ์žˆ์Œ (๋ฐ์ดํ„ฐ ๋ณ€ํ™˜, ๊ฒ€์ฆ ๋“ฑ)
3๏ธโƒฃ ํด๋ž˜์Šค ๋‚ด๋ถ€ ๊ตฌํ˜„์„ ๋ณ€๊ฒฝํ•ด๋„ ์™ธ๋ถ€ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•  ํ•„์š” ์—†์Œ

String name = person.getName();
int age = person.getAge();
String address = person.getAddress();

๐Ÿ“Œ ๊ฒŒํ„ฐ ๋งค์„œ๋“œ ์ถ”๊ฐ€ํ•˜๊ธฐ

1๏ธโƒฃ ํด๋ž˜์Šค ๊ฐ์ฒดํŒŒ์ผ์— ์ถ”๊ฐ€
class Person {
    private String name;
    private int age;
    private String address;

    // ์ƒ์„ฑ์ž
    public Person(String name, int age, String address) {
        this.name = name;
        this.age = age;
        this.address = address;
    }

    // ๊ฒŒํ„ฐ (Getter) ๋งค์„œ๋“œ
    public String getName() { 
        return name; 
    }
    
    public int getAge() { 
        return age; 
    }
    
    public String getAddress() { 
        return address; 
    }
}

2๏ธโƒฃ Main ๊ฒŒํ„ฐ ํ˜ธ์ถœ
public class Main {
    public static void main(String[] args) {
        // ๐Ÿ‘ค Person ๊ฐ์ฒด ์ƒ์„ฑ
        Person person = new Person("gygim", 25, "Seoul");

        // ๐Ÿ“ข ๊ฒŒํ„ฐ ํ˜ธ์ถœํ•˜์—ฌ ์†์„ฑ ๊ฐ€์ ธ์˜ค๊ธฐ
        String name = person.getName();
        int age = person.getAge();
        String address = person.getAddress();

        // ๐Ÿ–จ ์ถœ๋ ฅ
        System.out.println("์ด๋ฆ„: " + name);
        System.out.println("๋‚˜์ด: " + age);
        System.out.println("์ฃผ์†Œ: " + address);
    }
}
  • ์„ธํ„ฐ๋Š” ๊ฐ์ฒด์˜ ์†์„ฑ์„ ์™ธ๋ถ€์—์„œ ์„ค์ •ํ• ์ˆ˜์žˆ๊ฒŒ ํ•ด์ฃผ๋Š”๊ธฐ๋Šฅ
  • ๋ณดํ†ต setํ•„๋“œ๋ช…(๊ฐ’) ํ˜•ํƒœ๋กœ ์ •์˜, ํ•ด๋‹น ์†์„ฑ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋Š” ์—ญํ• ์„ํ•จ
  • ์ฃผ์˜! getName()์ด ์•„๋‹ˆ๋ผ setName()์ด ๋˜์–ด์•ผํ•จ
  • ์˜ฌ๋ฐ”๋ฅธ ๋„ค์ด๋ฐ์€ setName(), setAge(), setAddress()
  • Getter์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ์บก์Šํ™”๋ฅผ ์œ ์ง€ํ•˜๋ฉด์„œ ์†์„ฑ์„ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹คํ•จ

๐Ÿ’ก์„ธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•˜๋Š”์ด์œ ?

1๏ธโƒฃ ๊ฐ์ฒด์˜ ์†์„ฑ์„ private์œผ๋กœ ๋ณดํ˜ธ (์บก์Šํ™”)
โ†’ ์ง์ ‘ ์ˆ˜์ • ๋ฐฉ์ง€, ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ ๐Ÿšซ
2๏ธโƒฃ ๋ณ€๊ฒฝํ•  ๋•Œ ์ถ”๊ฐ€ ๋กœ์ง์„ ๋„ฃ์„ ์ˆ˜ ์žˆ์Œ
โ†’ ๊ฐ’์ด ์œ ํšจํ•œ์ง€ ํ™•์ธ ๊ฐ€๋Šฅ!
3๏ธโƒฃ ๊ฐ์ฒด ๋‚ด๋ถ€ ๊ตฌํ˜„์ด ๋ฐ”๋€Œ์–ด๋„ ์™ธ๋ถ€ ์ฝ”๋“œ ์ˆ˜์ • ํ•„์š” ์—†์Œ
โ†’ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์‰ฌ์›Œ์ง!

๐Ÿ“Œ ์˜ˆ์ œ (๋‚˜์ด๊ฐ€ 0๋ณด๋‹ค ์ž‘์œผ๋ฉด ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€)

    if (age < 0) {
        System.out.println("๋‚˜์ด๋Š” 0์ด ๋  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค!");
    } else {
        this.age = age;
    }
}

๐Ÿ“Œ ์„ธํ„ฐ๋งค์„œ๋“œ์ถ”๊ฐ€ํ•˜๊ธฐ

1๏ธโƒฃ ํด๋ž˜์Šค ๊ฐ์ฒดํŒŒ์ผ์— ์ถ”๊ฐ€
class Person {
    private String name;
    private int age;
    private String address;

    // ์ƒ์„ฑ์ž
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // Getter (๊ฒŒํ„ฐ): ์†์„ฑ ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๊ธฐ
    public String getName() { return name; }
    public int getAge() { return age; }
    public String getAddress() { return address; }

    //  Setter (์„ธํ„ฐ): ์†์„ฑ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๊ธฐ
    public void setName(String name) {
        this.name = name;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public void setAddress(String address) {
        this.address = address;
    }
}
2๏ธโƒฃ Main ์—์„œ ์„ธํ„ฐ ์‚ฌ์šฉํ•˜๊ธฐ
public class Main {
    public static void main(String[] args) {
        //  ๊ฐ์ฒด ์ƒ์„ฑ
        Person personA = new Person("gygim", 20);
        Person personB = new Person("Steve", 15);

        // ์„ธํ„ฐ () ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฃผ์†Œ ๋ณ€๊ฒฝ
        personA.setAddress("์„œ์šธ");
        personB.setAddress("๋ฏธ๊ตญ");

        //  ๊ฐ’ ์ถœ๋ ฅ
        System.out.println(personA.getName() + "์˜ ์ฃผ์†Œ: " + personA.getAddress());
        System.out.println(personB.getName() + "์˜ ์ฃผ์†Œ: " + personB.getAddress());
    }
}


gygim์˜ ์ฃผ์†Œ: ์„œ์šธ
Steve์˜ ์ฃผ์†Œ: ๋ฏธ๊ตญ

๐Ÿ“š JAM ๋ฉ”๋ชจ๋ฆฌ๊ตฌ์กฐ

  • Method Area (๋„์„œ๊ด€ ๋น„์œ )

    • ํ”„๋กœ๊ทธ๋žจ์‹œ์ž‘์‹œ ์ •๋ณด๊ฐ€ ์ €์žฅ๋จ
    • ํด๋ž˜์Šค ์ •๋ณด(.class ํŒŒ์ผ) ๊ฐ€ ์˜ฌ๋ผ๊ฐ€๋Š” ๊ณณ
    • ๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ ์ •๋ณด, static ๋ณ€์ˆ˜ ๋“ฑ์ด ์ €์žฅ
    • ๋ชจ๋“  ๊ฐ์ฒด๊ฐ€ ๊ณต์œ ํ•˜๋Š” ๊ณต์šฉ๊ณต๊ฐ„
    • ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์‹œ์ ์— ํ•œ๋ฒˆ๋งŒ ์ €์žฅ๋จ
  • Stack Area(์ ‘์‹œ ์Œ“๊ธฐ ๋น„์œ )

    • ๊ฐ€์žฅ์œ„์—์žˆ๋Š” ์ ‘์‹œ๋ถ€ํ„ฐ ๊บผ๋‚ด๋Š”๊ฒƒ ์ฒ˜๋Ÿผ ๋น„์Šทํ•œ ๊ตฌ์กฐ
    • ์„ ์ž…ํ›„์ถœ๊ตฌ์กฐ, ๋จผ์ € ๋“ค์–ด์˜จ๊ฒƒ์ด ๊ฐ€์žฅ ๋Šฆ๊ฒŒ ๋‚˜๊ฐ„๋‹ค๋Š” ๋œป์ž„
    • ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ์ ‘์‹œํ•œ์žฅ(์Šคํƒํ”„๋ ˆ์ž„)์ด ์Œ“์ž„
    • ๊ฐ€์žฅ ์œ„์˜ ์ ‘์‹œ(์ตœ๊ทผ ํ˜ธ์ถœ๋œ ๋ฉ”์„œ๋“œ)๊ฐ€ ๋จผ์ € ์‹คํ–‰
    • ๋ฉ”์„œ๋“œ๊ฐ€ ์‹œ์ž‘๋˜๋ฉด ์ถ”๊ฐ€๋˜๊ณ  ๋ฉ”์„œ๋“œ๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด ์‚ฌ๋ผ์ง€๋Š” ๊ตฌ์กฐ
    • ํŠน์ • ๋ฉ”์„œ๋“œ๊ฐ€ ์‹คํ–‰๋˜๋ฉด ํ•ด๋‹น ๋ฉ”์„œ๋“œ์˜ ์ •๋ณด์™€ ๋ณ€์ˆ˜๊ฐ€ Stack ์— ์ €์žฅ๋˜๊ณ  ๋ฉ”์„œ๋“œ ์‹คํ–‰์ด ๋๋‚˜๋ฉด ๊ทธ ๋ฉ”๋ชจ๋ฆฌ๋Š” ์ž๋™์œผ๋กœ ์ œ๊ฑฐ ๋จ

  • Heap Area(ํ’์„  ๋น„์œ )
    • new ํ‚ค์›Œ๋“œ๋กœ ์ƒ์„ฑ๋œ ๊ฐ์ฒด๋Š” Heap ์˜์—ญ์— ์ €์žฅ๋จ
    • ๊ฐ์ฒด์˜ ์‹ค์ œ ๋ฐ์ดํ„ฐ ์ €์žฅ, ๋ฐ์ดํ„ฐ ์ฃผ์†Œ๋Š” stack ์˜์—ญ์— ์ €์žฅ๋จ
    • stack์€ ๋ฉ”์„œ๋“œ ์‹คํ–‰ ์ค‘์—๋งŒ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ(์ง€์—ญ ๋ณ€์ˆ˜, ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ)๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์ž„!!

๐Ÿ“Œ ๋ž˜ํผํด๋ž˜์Šค

  • ๊ธฐ๋ณธ์ž๋ฃŒํ˜• ์„ ๊ฐ์ฒด๋กœ ๊ฐ์‹ธ๋Š” ํด๋ž˜์Šค

๐Ÿ’ก ์™œ์‚ฌ์šฉํ• ๊นŒ?์•Œ์•„๋ณผ๊นŒ๋‚˜

  • ๊ธฐ๋ณธํ˜•(int, double ๋“ฑ)์€ ๊ทธ๋ƒฅ ์ˆซ์ž์ผ ๋ฟ, ๊ธฐ๋Šฅ์ด ์—†๋‹ค!
    โ†’ int ์ž์ฒด๋กœ๋Š” ์•„๋ฌด ๊ธฐ๋Šฅ๋„ ๋ชป ํ•˜์ง€๋งŒ, Integer๋Š” ์ˆซ์ž๋ฅผ ๋ณ€ํ™˜ํ•˜๊ฑฐ๋‚˜ ๋น„๊ตํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•จ
  • ๊ธฐ๋ณธํ˜•์€ ๋ฆฌ์ŠคํŠธ(List)์— ๋ชป ๋„ฃ๋Š”๋‹ค!
    โ†’ List๋Š” ์•ˆ ๋˜์ง€๋งŒ, List๋Š” ๊ฐ€๋Šฅ! ๊ทธ๋ž˜์„œ ๊ธฐ๋ณธํ˜•์„ ๊ฐ์ฒด(Integer)๋กœ ๊ฐ์‹ธ์•ผ ํ•จ
  • null ๊ฐ’์„ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค!
    โ†’ int num = null; โŒ ์˜ค๋ฅ˜ ๋ฐœ์ƒ! ์ €๊ฒƒ์€ ์ˆซ์ž๊ฑฐ๋ฉ
    โ†’ Integer num = null; โœ… ๊ฐ€๋Šฅ!์™œ๋ƒ ๊ฐ์ฒด๋‹ˆ๊นŒ์๊ฐ€๋Šฅ
  • ์ž๋ฐ”๊ฐ€ ์ž๋™์œผ๋กœ ๋ณ€ํ™˜ํ•ด ์ค€๋‹ค!
    โ†’ Integer num = 10; (int๊ฐ€ ์ž๋™์œผ๋กœ Integer๋กœ ๋ณ€ํ™˜๋จ)
    โ†’ int value = num; (Integer๊ฐ€ ์ž๋™์œผ๋กœ int๋กœ ๋ณ€ํ™˜๋จ)
    = ์ฆ‰ ๋ณธํ˜•์„ ๊ฐ์ฒด์ฒ˜๋Ÿผ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด ์ฃผ๋Š” ๊ฒŒ ๋ ˆํผํด๋ผ์Šค, ํ† ๋‹ฌ์ง€๋งˆ ์ง€์—ฐ์•„๐Ÿ‘
์ž๋ฃŒํ˜• ๋ž˜ํผํด๋ž˜์Šค ์ข…๋ฅ˜ ๋ฒ”์œ„ ๋ฐ”์ดํŠธ ๋น„ํŠธ
boolean Boolean ๋…ผ๋ฆฌํ˜• true ๋˜๋Š” false 1 8
char Character ๋ฌธ์žํ˜• 0 ~ 65535 (์œ ๋‹ˆ์ฝ”๋“œ ๊ฐ’) 2 16
byte Byte ์ •์ˆ˜ํ˜• -128 ~ 127 1 8
short Short ์ •์ˆ˜ํ˜• -32,768 ~ 32,767 2 16
int Integer ์ •์ˆ˜ํ˜• -2,147,483,648 ~ 2,147,483,647 4 32
long Long ์ •์ˆ˜ํ˜• -9,233,372,036,854,775,808 ~ 9,233,372,036,854,775,807 8 64
float Float ์‹ค์ˆ˜ํ˜• ์•ฝ ์†Œ์ˆ˜์  6~7์ž๋ฆฌ๊นŒ์ง€ 4 32
double Double ์‹ค์ˆ˜ํ˜• ์•ฝ ์†Œ์ˆ˜์  15~17์ž๋ฆฌ๊นŒ์ง€ 8 64

๐Ÿ“Œ ๋ž˜ํผํด๋ผ์Šค ์˜ˆ์‹œ

1๏ธโƒฃ ํด๋ž˜์Šค ๊ฐ์ฒดํŒŒ์ผ
class CustomInteger {
		// ์†์„ฑ
  int value; 
  // ์ƒ์„ฑ์ž
  CustomInteger(int value) {
      this.value = value;
  }
		// ๊ธฐ๋Šฅ
  // ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๋Š” ๋ฉ”์„œ๋“œ
  int getValue() {
      return value;
  }

  // ๊ฐ’์„ ์„ค์ •ํ•˜๋Š” ๋ฉ”์„œ๋“œ
  void setValue(int value) {
      this.value = value;
  }

  // toString() ์˜ค๋ฒ„๋ผ์ด๋”ฉ (๊ฐ’์„ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ๋„๋ก)
  @Override
  public String toString() {
      return String.valueOf(value);
  }
}
1๏ธโƒฃ ๋ฉ”์ธ ํŒŒ์ผ
public class Main {
  public static void main(String[] args) {
      CustomInteger num1 = new CustomInteger(100);
      System.out.println(num1); // 100
      System.out.println(num1.getValue()); // 100

      num1.setValue(200);
      System.out.println(num1); // 200
  }
}

๐Ÿ“Œ ์ฐธ์กฐํ˜•

  • ๋ณ€์ˆ˜์— ๊ฐ์ฒด๊ฐ€ ๋‹ด๊ธฐ๋ฉด ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ˜• ๋ณ€์ˆ˜๋ผ๊ณ  ๋งํ•จ

  • ์ฐธ์กฐํ˜• ๋ณ€์ˆ˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋œ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š”๋ฐ Heap ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋œ๋‹ค

  • ๊ฐ์ฒด๋ฐ์ดํ„ฐ๋Š” JAM ๋ฉ”๋ชจ๋ฆฌ๊ตฌ์กฐ ํ’์„ ์— ๋น„์œ ํ–ˆ๋˜ Heap ์˜์—ญ์— ์ €์žฅ๋˜์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ์ž„

  • ๊ฐ์ฒด, ๋ฐฐ์—ด๋“ฑ์ด ์ฐธ์กฐํ˜•์— ์†ํ•จ

๐Ÿ’ก๊ฐ์ฒด์ผ๊ฒฝ์šฐ

Person personA = new Person("Steve");  โœ… ๊ฐ์ฒด๊ฐ€  ๋‹ด๊ธด personA ๋Š” ์ฐธ์กฐํ˜• ๋ณ€์ˆ˜
Syetem.out.println(personA.name);
System.out.println(personA); // โœ… ์ถœ๋ ฅํ•˜๋ฉด @123 ๋ฉ”๋ชจ๋ฆฌ์˜ ์ฃผ์†Œ๊ฐ’์ด ์ถœ๋ ฅ๋จ

๐Ÿ’ก๋ฐฐ์—ด์ผ๊ฒฝ์šฐ

int[] arr = {1, 2, 3, 4}; // โœ… ๋ฐฐ์—ด์ด ๋‹ด๊ธด arr ๋Š” ์ฐธ์กฐํ˜• ๋ณ€์ˆ˜
System.out.println(arr); // โœ… ์ถœ๋ ฅํ•˜๋ฉด @123 ๋ฉ”๋ชจ๋ฆฌ์˜ ์ฃผ์†Œ๊ฐ’ ์ถœ๋ ฅ 
1๏ธโƒฃ ํด๋ž˜์Šค ๊ฐ์ฒดํŒŒ์ผ
class CustomInteger {
		// ์†์„ฑ
  int value; 
  // ์ƒ์„ฑ์ž
  CustomInteger(int value) {
      this.value = value;
  }
		// ๊ธฐ๋Šฅ
  // ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๋Š” ๋ฉ”์„œ๋“œ
  int getValue() {
      return value;
  }

  // ๊ฐ’์„ ์„ค์ •ํ•˜๋Š” ๋ฉ”์„œ๋“œ
  void setValue(int value) {
      this.value = value;
  }

  // toString() ์˜ค๋ฒ„๋ผ์ด๋”ฉ (๊ฐ’์„ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ๋„๋ก)
  @Override
  public String toString() {
      return String.valueOf(value);
  }
}
1๏ธโƒฃ ๋ฉ”์ธ ํŒŒ์ผ
public class Main {
  public static void main(String[] args) {
      CustomInteger num1 = new CustomInteger(100);
      System.out.println(num1); // 100
      System.out.println(num1.getValue()); // 100

      num1.setValue(200);
      System.out.println(num1); // 200
  }
}

์ „์ฒด ํ๋ฆ„ 
1๏ธโƒฃ CustomInteger(100) โ†’ ์ฒ˜์Œ์— 100 ์ €์žฅ
2๏ธโƒฃ System.out.println(num1); โ†’ 100 ์ถœ๋ ฅ๋จ
3๏ธโƒฃ num1.setValue(200); โ†’ ๊ฐ’์ด 100 โ†’ 200์œผ๋กœ ๋ณ€๊ฒฝ๋จ
4๏ธโƒฃ System.out.println(num1); โ†’ 200 ์ถœ๋ ฅ๋จ โœ… ์™œ ๋‡Œ์ง€์ง„์™€ ใ…  ์ง„์ •ํ•ด ์ง€์—ฐ์•„ 

โœ… ๊ธฐ๋ณธํ˜•๊ณผ ๋ ˆํผํ˜• ์†๋„ ํ™•์ธ ๐ŸŽ๏ธ๐Ÿ’จ

  • ๊ธฐ๋ณธํ˜•(int)์€ ๊ทธ๋ƒฅ ์ˆซ์ž! โ†’ ์—ฐ์‚ฐ์ด ๋ฐ”๋กœ๋ฐ”๋กœ ์ง„ํ–‰๋จ
  • ๋ž˜ํผ ํด๋ž˜์Šค(Integer)๋Š” ์ˆซ์ž๋ฅผ ๊ฐ์‹ผ 'ํฌ์žฅ์ง€' ๊ฐ™์€ ์กด์žฌ
  • ๋ž˜ํผํด๋ž˜์Šค๋Š” ์—ฐ์‚ฐํ•  ๋•Œ๋งˆ๋‹ค ํฌ์žฅ์„ ๋ฒ—๊ธฐ๊ณ (์–ธ๋ฐ•์‹ฑ) ๋‹ค์‹œ ๊ฐ์‹ธ์•ผ(์˜คํ† ๋ฐ•์‹ฑ) ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋Š๋ฆผ!
  • โณ ๋ฐ˜๋ณต๋ฌธ์ฒ˜๋Ÿผ ๋งŽ์€ ์—ฐ์‚ฐ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๊ธฐ๋ณธํ˜•์„ ์“ฐ๋Š” ๊ฒŒ ์œ ๋ฆฌํ•จ!
  • ํ•˜์ง€๋งŒ! ๊ฐ์ฒด์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค๋ฉด Integer๋„ ํ•„์š”ํ•  ๋•Œ๊ฐ€ ์žˆ์Œ ๐ŸŽ
๋น„๊ต ํ•ญ๋ชฉ ๊ธฐ๋ณธํ˜• (int) ๋ž˜ํผ ํด๋ž˜์Šค (Integer)
๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ์ ๊ฒŒ ์ฐจ์ง€ํ•จ
int a = 10;
๋งŽ์ด ์ฐจ์ง€ํ•จ (๊ฐ์ฒด๋กœ ๊ฐ์‹ธ์•ผ ํ•ด์„œ)
Integer b = 10;
์—ฐ์‚ฐ ์†๋„ ๋น ๋ฆ„
int sum = a + 5;
๋Š๋ฆผ (ํฌ์žฅ์„ ๋ฒ—๊ธฐ๊ณ  ๋‹ค์‹œ ์”Œ์šฐ๋Š” ๊ณผ์ • ํ•„์š”)
Integer sum = b + 5;
๋ฐฐ์—ด/๋ฆฌ์ŠคํŠธ ์ €์žฅ ๋ฐฐ์—ด์— ์ €์žฅ ๊ฐ€๋Šฅ
int[] arr = {1, 2, 3};
๋ฆฌ์ŠคํŠธ, ๋งต์— ์ €์žฅ ๊ฐ€๋Šฅ
List<Integer> list = new ArrayList<>();
null ์ €์žฅ ๊ฐ€๋Šฅ ์—ฌ๋ถ€ ๋ถˆ๊ฐ€๋Šฅ ๊ฐ€๋Šฅ (๊ฐ’์ด ์—†์„ ๋•Œ null ์‚ฌ์šฉ ๊ฐ€๋Šฅ)
Integer c = null;
์–ธ์ œ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์„๊นŒ? ๋‹จ์ˆœํ•œ ๊ณ„์‚ฐ, ๋น ๋ฅธ ์—ฐ์‚ฐ์ด ํ•„์š”ํ•  ๋•Œ
int result = a * 2;
๋ฆฌ์ŠคํŠธ๋‚˜ ๋งต์— ์ €์žฅํ•  ๋•Œ, ๊ฐ์ฒด์ฒ˜๋Ÿผ ๋‹ค๋ค„์•ผ ํ•  ๋•Œ
Map<String, Integer> scores = new HashMap<>();

๐Ÿ“Œ ๊ถ๊ธˆ์ฆ ๋Œ€๋งˆ์™•์˜ ์˜ˆ์ œ

int ์—ฐ์‚ฐ ์‹œ๊ฐ„: 30ms  
Integer ์—ฐ์‚ฐ ์‹œ๊ฐ„: 300ms  (10๋ฐฐ ์ด์ƒ ๋Š๋ฆผ)  
public class PerformanceTest {
  public static void main(String[] args) {
      int iterations = 10_000_000; // 1์ฒœ๋งŒ ๋ฒˆ ๋ฐ˜๋ณต

      โ˜‘๏ธ ๊ธฐ๋ณธํ˜• int ์—ฐ์‚ฐ
      long start1 = System.nanoTime();
      int sum1 = 0;
      for (int i = 0; i < iterations; i++) {
          sum1 += i;  //  ๋”ํ•˜๊ธฐ
      }
      long end1 = System.nanoTime();
      System.out.println("int ์—ฐ์‚ฐ ์‹œ๊ฐ„: " + (end1 - start1) + " ns");

      โ˜‘๏ธ ๋ž˜ํผ ํด๋ž˜์Šค Integer ์—ฐ์‚ฐ
      long start2 = System.nanoTime();
      Integer sum2 = 0;
      for (int i = 0; i < iterations; i++) {
          sum2 += i;  // ์–ธ๋ฐ•์‹ฑ & ์˜คํ† ๋ฐ•์‹ฑ ๋ฐœ์ƒ
      }
      long end2 = System.nanoTime();
      System.out.println("Integer ์—ฐ์‚ฐ ์‹œ๊ฐ„: " + (end2 - start2) + " ns");
  }
}

๐Ÿ“š static ํด๋ž˜์Šค ๊ณต์œ 

  • static ํ‚ค์›Œ๋“œ๋Š” ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ณ€์ˆ˜์™€ ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•  ๋•Œ ์‚ฌ์šฉ๋จ
  • ๋ชจ๋“  ๊ฐ์ฒด๊ฐ€ ๊ฐ™์€ ๊ฐ’์„ ๊ณต์œ  โ†’ ๊ณต์šฉ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ์— ์ ํ•ฉ
  • ํด๋ž˜์Šค ์ด๋ฆ„์œผ๋กœ ์ง์ ‘ ์ ‘๊ทผ ๊ฐ€๋Šฅ โ†’ ํด๋ž˜์Šค๋ช….๋ณ€์ˆ˜๋ช… or ํด๋ž˜์Šค๋ช….๋ฉ”์„œ๋“œ๋ช…()
  • Method Area(๋ฉ”์„œ๋“œ ์˜์—ญ)์— ์ €์žฅ๋˜๋ฉฐ ํ•œ ๋ฒˆ๋งŒ ์ƒ์„ฑ๋จ

    ๊ตฌ๋ถ„ static ๋ณ€์ˆ˜ (ํด๋ž˜์Šค ๋ณ€์ˆ˜) ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜
    ์†Œ์† ํด๋ž˜์Šค ์ž์ฒด ๊ฐœ๋ณ„ ๊ฐ์ฒด
    ์ƒ์„ฑ ์‹œ์  ํด๋ž˜์Šค๊ฐ€ ๋กœ๋“œ๋  ๋•Œ ๋”ฑ ํ•œ ๋ฒˆ ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ๋งˆ๋‹ค
    ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ Method Area(๋ฉ”์„œ๋“œ ์˜์—ญ) Heap ์˜์—ญ
    ๊ณต์œ  ์—ฌ๋ถ€ โœ… ๋ชจ๋“  ๊ฐ์ฒด๊ฐ€ ๊ณต์œ  โŒ ๊ฐ์ฒด๋ณ„๋กœ ๋…๋ฆฝ์ 
    ์ ‘๊ทผ ๋ฐฉ์‹ ํด๋ž˜์Šค๋ช….๋ณ€์ˆ˜๋ช… ๊ฐ์ฒด๋ช….๋ณ€์ˆ˜๋ช…

โš ๏ธ static ๋ณ€์ˆ˜ vs ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜์˜ ์ ‘๊ทผ ๋ฐฉ์‹ ์ฐจ์ด

  • ๋ณ€์ˆ˜๊ฐ€ ์–ด๋””์— ์†ํ•ด ์žˆ๊ณ , ์–ด๋–ป๊ฒŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์ดํ•ด๋ฅผ ํ•ด์•ผํ•ด ์ง€์—ฐ์•„
  • ํ•™๊ต ๋ฐ˜์— ํ•™์ƒ, ๋„Œ ํ•™์ƒ์ด๊ณ ! ๋‚œ ์„ฑ์ƒ์ด์–‘! >@<
๋ณ€์ˆ˜ ์ข…๋ฅ˜ ์„ค๋ช… ์˜ˆ์‹œ
static ๋ณ€์ˆ˜ (ํด๋ž˜์Šค ๋ณ€์ˆ˜) ๋ชจ๋“  ํ•™์ƒ(๊ฐ์ฒด)์ด ํ•จ๊ป˜ ๊ณต์œ ํ•˜๋Š” ๊ฐ’ "ํ•™๊ต ์ด๋ฆ„" ๊ฐ™์€ ๊ฑฐ!
๋ชจ๋“  ๋ฐ˜(๊ฐ์ฒด)์—์„œ ๊ฐ™์€ ํ•™๊ต๋ฅผ ๋‹ค๋‹˜.
์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜ (๊ฐ์ฒด ๋ณ€์ˆ˜) ๊ฐ ํ•™์ƒ(๊ฐ์ฒด)์ด ๊ฐœ๋ณ„์ ์œผ๋กœ ๊ฐ€์ง€๋Š” ๊ฐ’ "ํ•™์ƒ ์ด๋ฆ„" ๊ฐ™์€ ๊ฑฐ!
๊ฐ ํ•™์ƒ(๊ฐ์ฒด)๋งˆ๋‹ค ๋‹ค๋ฅธ ์ด๋ฆ„์„ ๊ฐ€์ง.
class School {
static String schoolName = "์ฝ”๋”ฉ ๊ณ ๋“ฑํ•™๊ต"; // ๋ชจ๋“  ํ•™์ƒ์ด ๊ณต์œ ํ•˜๋Š” static ๋ณ€์ˆ˜
String studentName; // ๊ฐ ํ•™์ƒ๋งˆ๋‹ค ๋‹ค๋ฅธ ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜ 

 \
School(String name) {    // ์ƒ์„ฑ์ž (ํ•™์ƒ ์ด๋ฆ„ ์„ค์ •)
      this.studentName = name;
  }
}

๐Ÿ“” Static ํ™œ์šฉ (๋ณ€์ˆ˜,๋ฉ”์„œ๋“œ)

๐Ÿ“Œ static ๋ณ€์ˆ˜(ํด๋ž˜์Šค ๋ณ€์ˆ˜)

ํด๋ž˜์Šค๊ฐ€ ๋กœ๋“œ๋  ๋•Œ ํ•œ ๋ฒˆ๋งŒ ์ƒ์„ฑ๋˜๊ณ , ๋ชจ๋“  ๊ฐ์ฒด๊ฐ€ ๊ณต์œ ํ•จ

static int count = 0;  //  ๋ชจ๋“  ๊ฐ์ฒด๊ฐ€ ๊ณต์œ ํ•˜๋Š” ๋ณ€์ˆ˜
public Counter() {
        count++; // ์ƒ์„ฑ๋  ๋•Œ๋งˆ๋‹ค count ์ฆ๊ฐ€
    }
}
public class Main {
    public static void main(String[] args) {
        Counter c1 = new Counter();
        Counter c2 = new Counter();
        Counter c3 = new Counter();
 System.out.println(Counter.count); // โญ๏ธ ์ถœ๋ ฅ: 3 
                                    (๋ชจ๋“  ๊ฐ์ฒด๊ฐ€ ๊ฐ™์€ ๋ณ€์ˆ˜ ๊ณต์œ )
    }
}

๐Ÿ“Œ static ๋ฉ”์„œ๋“œ(ํด๋ž˜์Šค ๋ฉ”์„œ๋“œ)

๊ฐ์ฒด ์—†์ด ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๊ณ , ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Œ

class MathUtils {
static int add(int a, int b) {
      return a + b;
  }
}
public class Main {
  public static void main(String[] args) {
      int result = MathUtils.add(10, 20); // โœ… ํด๋ž˜์Šค๋ช….๋ฉ”์„œ๋“œ๋ช…() ํ˜ธ์ถœ
      System.out.println(result); // ์ถœ๋ ฅ: 30
  }
}```

๐Ÿ“• ์ธ์Šคํ„ด์Šค ๋ฉค๋ฒ„ (๊ฐ์ฒด ์ƒ์„ฑ ํ›„ ์‚ฌ์šฉ ๊ฐ€๋Šฅ!)

  • ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค ๋•Œ ์ƒ์„ฑ๋˜๋Š” ๋ณ€์ˆ˜์™€ ๋ฉ”์„œ๋“œ

  • ํด๋ž˜์Šค๋งŒ์œผ๋กœ๋Š” ์ ‘๊ทผํ•  ์ˆ˜ ์—†์Œ! (new ํ‚ค์›Œ๋“œ๋กœ ๊ฐ์ฒด ์ƒ์„ฑ ํ•„์ˆ˜)

  • ๊ฐ ๊ฐ์ฒด๋งˆ๋‹ค ๊ฐœ๋ณ„์ ์œผ๋กœ ๊ฐ’์„ ๊ฐ€์ง (๊ณต์œ  ์•ˆ๋จ)

  • Heap ์˜์—ญ์— ์ €์žฅ๋จ (๊ฐ์ฒด๊ฐ€ ์‚ฌ๋ผ์ง€๋ฉด ๊ฐ™์ด ์‚ญ์ œ๋จ)

๐Ÿ“Œ ์ธ์Šคํ„ด์Šค ์˜ˆ์ œ

class Student {
  String name;         // ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜

  void introduce() {    // ์ธ์Šคํ„ด์Šค ๋ฉ”์„œ๋“œ
      System.out.println("์•ˆ๋…•ํ•˜์„ธ์š”! ์ €๋Š” " + name + "์ž…๋‹ˆ๋‹ค.");
  }
}
public class Main {
  public static void main(String[] args) {
      Student student1 = new Student();   //
      student1.name = "์ง€์—ฐ";
      student1.introduce(); // ์ถœ๋ ฅ: ์•ˆ๋…•ํ•˜์„ธ์š”! ์ €๋Š” ์ง€์—ฐ์ž…๋‹ˆ๋‹ค.

      Student student2 = new Student(); 
      student2.name = "๋ฏผ์ˆ˜";
      student2.introduce(); // ์ถœ๋ ฅ: ์•ˆ๋…•ํ•˜์„ธ์š”! ์ €๋Š” ๋ฏผ์ˆ˜์ž…๋‹ˆ๋‹ค.
  }
}

โœ…ํ™•์ธํ•˜๊ธฐ
void introduce() // void โ†’ ๋ฐ˜ํ™˜๊ฐ’์ด ์—†์Œ (๋‹จ์ˆœํžˆ ์‹คํ–‰๋งŒ ํ•จ) , introduce() โ†’ ์ด ๋ฉ”์„œ๋“œ ์ด๋ฆ„ (์ž๊ธฐ์†Œ๊ฐœํ•˜๋Š” ๊ธฐ๋Šฅ)
System.out.println("์•ˆ๋…•ํ•˜์„ธ์š”! ์ €๋Š” " + name + "์ž…๋‹ˆ๋‹ค."); //โ†’ name์— ์ €์žฅ๋œ ๊ฐ’๊ณผ ํ•จ๊ป˜ ์ถœ๋ ฅ
Student student1 = new Student() //๊ฐ์ฑ„์ƒ์„ฑ

๐Ÿงน static ์ •๋ฆฌ

๊ตฌ๋ถ„ ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜ ํด๋ž˜์Šค ๋ณ€์ˆ˜ (static) ์ธ์Šคํ„ด์Šค ๋ฉ”์„œ๋“œ ํด๋ž˜์Šค ๋ฉ”์„œ๋“œ (static)
์ƒ์„ฑ ์‹œ์  ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ ํด๋ž˜์Šค๊ฐ€ ๋กœ๋“œ๋  ๋•Œ ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ ํด๋ž˜์Šค๊ฐ€ ๋กœ๋“œ๋  ๋•Œ
๋ฉ”๋ชจ๋ฆฌ ์œ„์น˜ Heap (๊ฐ์ฒด๋ณ„ ์ €์žฅ) Method Area (๊ณต์œ ) Heap Method Area (๊ณต์œ )
๊ณต์œ  ์—ฌ๋ถ€ โŒ ๊ฐ์ฒด๋งˆ๋‹ค ๋…๋ฆฝ์  โœ… ๋ชจ๋“  ๊ฐ์ฒด๊ฐ€ ๊ณต์œ  โŒ ๊ฐ์ฒด๋ณ„๋กœ ์‹คํ–‰ โœ… ๊ฐ์ฒด ์—†์ด ์‹คํ–‰ ๊ฐ€๋Šฅ
์ ‘๊ทผ ๋ฐฉ๋ฒ• ๊ฐ์ฒด๋ช….๋ณ€์ˆ˜๋ช… ํด๋ž˜์Šค๋ช….๋ณ€์ˆ˜๋ช… ๊ฐ์ฒด๋ช….๋ฉ”์„œ๋“œ๋ช…() ํด๋ž˜์Šค๋ช….๋ฉ”์„œ๋“œ๋ช…()
์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜ ์‚ฌ์šฉ โœ… ๊ฐ€๋Šฅ โŒ ๋ถˆ๊ฐ€๋Šฅ โœ… ๊ฐ€๋Šฅ โŒ ๋ถˆ๊ฐ€๋Šฅ

๐Ÿ“‘ ์ƒ์ˆ˜์™€ ๋ถˆ๋ณ€๊ฐ์ฒด_ final

๐Ÿ“• ์ƒ์ˆ˜

  • ์ƒ์ˆ˜๋Š” ๋ณ€ํ•˜์ง€ ์•Š๊ณ  ์ผ์ •ํ•œ ๊ฐ’์„ ๊ฐ–๋Š”์ˆ˜
  • Java์—์„œ ์ƒ์ˆ˜๋Š” ๋Œ€๋ฌธ์ž๋กœ ํ‘œํ˜„ํ•˜๋Š” ๊ฒƒ์ด ๊ด€๋ก€์ž„
  • ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰์ค‘์— ์ ˆ๋Œ€ ๋ณ€๊ฒฝ๋˜์„œ๋Š” ์•ˆ๋˜๊ธฐ ๋•Œ๋ฌธ์— static final ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ์„ ์–ธํ•จ
  • static ํ‚ค์›Œ๋“œ๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋Š” ํ”„๋กœ๊ทธ๋žจ ์‹œ์ž‘ ์‹œ ํ•œ ๋ฒˆ๋งŒ ์ดˆ๊ธฐํ™”๋˜๋ฉฐ, ๋ชจ๋“  ์ธ์Šคํ„ด์Šค์—์„œ ๊ฐ™์€ ๊ฐ’์„ ๊ณต์œ 

๐Ÿ“Œ ๋Œ€ํ‘œ์ ์ธ์„ ์–ธ์˜ˆ์‹œ

  1. static final์„ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ์ˆ˜๋ฅผ ์„ ์–ธ
  2. ๋ณ€์ˆ˜๋ช…์„ ๋Œ€๋ฌธ์ž๋กœ ์ž‘์„ฑํ•˜๊ณ , ์—ฌ๋Ÿฌ ๋‹จ์–ด๋Š” _(์–ธ๋”์Šค์ฝ”์–ด)๋กœ ๊ตฌ๋ถ„
  3. PI, MAX_USER์ฒ˜๋Ÿผ ๋ณ€ํ•˜์ง€ ์•Š๋Š” ์ค‘์š”ํ•œ ๊ฐ’์„ ์ €์žฅํ•  ๋•Œ ์‚ฌ์šฉ๋จ
  class Constants {
    static final double PI = 3.141592;  // โœ… ์›์ฃผ์œจ ์ƒ์ˆ˜
    static final int MAX_USER = 100;   // โœ… ์ตœ๋Œ€ ์‚ฌ์šฉ์ž ์ˆ˜
}public class Main {
    public static void main(String[] args) {
        // โœ… ๊ฐ์ฒด ์ƒ์„ฑ ์—†์ด ํด๋ž˜์Šค๋ช….์ƒ์ˆ˜๋ช…์œผ๋กœ ์ง์ ‘ ์ ‘๊ทผ ๊ฐ€๋Šฅ
        System.out.println("์›์ฃผ์œจ: " + Constants.PI);
        System.out.println("์ตœ๋Œ€ ์‚ฌ์šฉ์ž ์ˆ˜: " + Constants.MAX_USER);
    }
}
์ถœ๋ ฅ ๊ฒฐ๊ณผ
์›์ฃผ์œจ: 3.141592  
์ตœ๋Œ€ ์‚ฌ์šฉ์ž ์ˆ˜: 100   

๐Ÿ“Œ ์ƒ์ˆ˜ํ™œ์šฉ์˜ˆ์‹œ

class Messages {
  static final String WELCOME = "ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค!";
  static final String ERROR = "์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.";
}

public class Main {
  public static void main(String[] args) {
      System.out.println(Messages.WELCOME); // โœ… "ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค!" ์ถœ๋ ฅ
      System.out.println(Messages.ERROR);   // โœ… "์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค." ์ถœ๋ ฅ

โœ” ํด๋ž˜์Šค๊ฐ€ ๋‘ ๊ฐœ ์žˆ์ง€๋งŒ, Messages๋Š” ์‹คํ–‰์šฉ์ด ์•„๋‹ˆ๋ผ ์ƒ์ˆ˜ ์ €์žฅ์šฉ
โœ” Main ํด๋ž˜์Šค์—์„œ Messages์˜ ์ƒ์ˆ˜๋ฅผ ๋ถˆ๋Ÿฌ์™€์„œ ์‚ฌ์šฉ ๐Ÿš€
  }
}

๐Ÿ“˜ ๋ถˆ๋ณ€๊ฐ์ฒด

  • ๋‚ด๋ถ€ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋Š” ๊ฐ์ฒด
  • final ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•„๋“œ(์†์„ฑ)๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์—†๋„๋ก ์„ค์ •
  • setter ๋ฉ”์„œ๋“œ ์—†์ด ์„ค๊ณ„ํ•˜์—ฌ ๋ณ€๊ฒฝ์„ ๋ฐฉ์ง€
  • ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•˜๋ฉด ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•จ
  • ๋Œ€ํ‘œ์ ์ธ ๋ถˆ๋ณ€๊ฐ์ฒด String, Integer, Double ๋“ฑ ๋ž˜ํผ ํด๋ž˜์Šค
public final class Circle {  
    final static double PI = 3.14159; // โœ… 1๏ธโƒฃ ํด๋ž˜์Šค๊ฐ€ ๋กœ๋“œ๋  ๋•Œ ์ €์žฅ๋จ
    final double radius; // โœ… 3๏ธโƒฃ ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ ๊ฐ’์ด ์„ค์ •๋จ

    Circle(double radius) {  
        this.radius = radius;  // โœ… 4๏ธโƒฃ ์ƒ์„ฑ์ž ์‹คํ–‰ -> radius ๊ฐ’์ด ๊ณ ์ •๋จ
    }
}

// โœ… 2๏ธโƒฃ main ์‹คํ–‰ (๊ฐ์ฒด ์ƒ์„ฑ ์‹œ์ž‘!)
public class Main {
    public static void main(String[] args) {
        Circle circle1 = new Circle(10.0); // โœ… 5๏ธโƒฃ ๋ฐ˜์ง€๋ฆ„ 10์งœ๋ฆฌ ์› ์ƒ์„ฑ!
        Circle circle2 = new Circle(5.0);  // โœ… 6๏ธโƒฃ ๋ฐ˜์ง€๋ฆ„ 5์งœ๋ฆฌ ์› ์ƒ์„ฑ!
    }
}
    }
}
  PI (static final)
โ†’ ํด๋ž˜์Šค๊ฐ€ ์ฒ˜์Œ ๋กœ๋“œ๋  ๋•Œ ์ €์žฅ๋˜๊ณ , ๋ชจ๋“  ๊ฐ์ฒด๊ฐ€ ๊ณต์œ !
radius (final)
โ†’ ๊ฐ์ฒด๋งˆ๋‹ค ๊ฐœ๋ณ„ ์ €์žฅ๋˜๊ณ , ์ƒ์„ฑ์ž์—์„œ ํ•œ ๋ฒˆ๋งŒ ์„ค์ • ๊ฐ€๋Šฅ!

๐Ÿ“™ ์ธํ…ŒํŽ˜์ด์Šค๋ž€?

๋ชจ๋“  ์„ค๊ณ„์—๋Š” ํ‘œ์ค€์ด ํ•„์š”ํ•˜๋‹ค!
์ธํ„ฐํŽ˜์ด์Šค๋Š” ํด๋ž˜์Šค๊ฐ€ ๋ฐ˜๋“œ์‹œ ๋”ฐ๋ผ์•ผ ํ•  ๊ทœ์น™(ํ‘œ์ค€)์„ ์ •์˜ํ•˜๋Š” ์—ญํ• ํ•จ!

๐Ÿ’ก ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ  ?

  • ๊ฐœ๋ฐœ์ž๋งˆ๋‹ค ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ๋ฉ”์„œ๋“œ๋ฅผ ๋งŒ๋“ ๋‹ค๋ฉด ์ผ๊ด€์„ฑ์ด ๊นจ์ง!
  • ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ™œ์šฉํ•˜๋ฉด ์ตœ์†Œํ•œ์˜ ๊ทœ๊ฒฉ์„ ์ •ํ•  ์ˆ˜ ์žˆ์Œ!
  • ์„ธ๋ถ€ ๊ตฌํ˜„์€ ๊ฐ ํด๋ž˜์Šค์—์„œ ์ž์œ ๋กญ๊ฒŒ ํ™•์žฅ ๊ฐ€๋Šฅ!
  • ์œ ์ง€๋ณด์ˆ˜์™€ ํ™•์žฅ์„ฑ์ด ๋›ฐ์–ด๋‚œ ์ฝ”๋“œ ์ž‘์„ฑ ๊ฐ€๋Šฅ!

๐Ÿข ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํšŒ์‚ฌ ๊ทœ์น™์œผ๋กœ์ƒ๊ฐ ํ•ด ๋ณด์ž!

๊ฐœ๋… ์˜ˆ์‹œ ์„ค๋ช…
์ธํ„ฐํŽ˜์ด์Šค ํšŒ์‚ฌ์˜ ๊ทœ์น™์„œ ๐Ÿ“œ "์ถœ๊ทผ ์‹œ๊ฐ„์€ 9์‹œ!"
"์ด๋ฉ”์ผ ๋„๋ฉ”์ธ์€ @company.com!"
ํด๋ž˜์Šค ์ง์› ๐Ÿง‘โ€๐Ÿ’ป ๊ฐœ๋ฐœ์ž๋Š” ์ฝ”๋”ฉ(),
๋””์ž์ด๋„ˆ๋Š” ๋””์ž์ธ()์„ ํ•ด์•ผ ํ•จ!

๐Ÿ“Œ ์ธํ„ฐํŽ˜์ด์Šค ์˜ˆ์ œ

class Employee {  
  void work() {
      System.out.println("์ง์›์ด ์ผ์„ ํ•ฉ๋‹ˆ๋‹ค!");
  }
}

class Developer extends Employee {
  @Override
  void work() {
      System.out.println("๐Ÿ‘จโ€๐Ÿ’ป ๊ฐœ๋ฐœ์ž๊ฐ€ ์ฝ”๋”ฉ์„ ํ•ฉ๋‹ˆ๋‹ค!");
  }
}

class Designer extends Employee {
  @Override
  void work() {
      System.out.println("๐ŸŽจ ๋””์ž์ด๋„ˆ๊ฐ€ ๋””์ž์ธ์„ ํ•ฉ๋‹ˆ๋‹ค!");
  }
}

public class Main {
  public static void main(String[] args) {
      Developer dev = new Developer();
      dev.work(); // ์ถœ๋ ฅ: ๐Ÿ‘จโ€๐Ÿ’ป ๊ฐœ๋ฐœ์ž๊ฐ€ ์ฝ”๋”ฉ์„ ํ•ฉ๋‹ˆ๋‹ค!

      Designer des = new Designer();
      des.work(); // โœ… ์ถœ๋ ฅ: ๐ŸŽจ ๋””์ž์ด๋„ˆ๊ฐ€ ๋””์ž์ธ์„ ํ•ฉ๋‹ˆ๋‹ค!
  }

๐Ÿ“š ์ธํ„ฐํŽ˜์ด์Šค๊ธฐ๋Šฅ

โœ… ์ธํ„ฐํŽ˜์ด์Šค ๋‹คํ˜•์„ฑ ์ ์šฉ

(์—ฌ๋Ÿฌ ๊ตฌํ˜„์ฒด๋ฅผ ๋™์ผํ•œ ํƒ€์ž…์œผ๋กœ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ์Œ!)

  • ์ธํ„ฐํŽ˜์ด์Šค ํƒ€์ž…์œผ๋กœ ๊ฐ์ฒด๋ฅผ ๋‹ค๋ฃจ๋ฉด, ์œ ์—ฐํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Œ!

  • ๊ฐ์ฒด์˜ ์‹ค์ œ ํƒ€์ž…(๊ตฌํ˜„์ฒด)์— ๋”ฐ๋ผ ๋‹ค๋ฅด๊ฒŒ ๋™์ž‘(๋‹คํ˜•์„ฑ)ํ•จ.

  • ์œ ์ง€๋ณด์ˆ˜์„ฑ๊ณผ ํ™•์žฅ์„ฑ์ด ์ข‹์•„์ง!

    ๐Ÿ“Œ ๋‹ค์ค‘๊ตฌํ˜„ ์˜ˆ์‹œ(Main,Dog,Cat class 3๊ฐœ)

// 1๏ธโƒฃ ์ธํ„ฐํŽ˜์ด์Šค ์ •์˜ -Animal ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด Dog, Cat์„ ๋™์ผํ•œ ํƒ€์ž…์œผ๋กœ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ์Œ
interface Animal {  
    void sound();  // ๋™๋ฌผ ์†Œ๋ฆฌ๋ฅผ ๋‚ด๋Š” ๋ฉ”์„œ๋“œ
}
// 2๏ธโƒฃ ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„ ํด๋ž˜์Šค (๊ตฌํ˜„์ฒด)
class Dog implements Animal {
    @Override
    public void sound() {
        System.out.println("๐Ÿถ ๋ฉ๋ฉ!");
    }
}  //3๏ธโƒฃ ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„ ํด๋ž˜์Šค (๊ตฌํ˜„์ฒด)
class Cat implements Animal {
    @Override
    public void sound() {
        System.out.println("๐Ÿฑ ์•ผ์˜น!");
    }
}
public class Main {
    public static void main(String[] args) {
        // 4๏ธโƒฃ ๋‹คํ˜•์„ฑ์„ ํ™œ์šฉํ•˜์—ฌ ์ธํ„ฐํŽ˜์ด์Šค ํƒ€์ž…์œผ๋กœ ๊ฐ์ฒด๋ฅผ ๋‹ค๋ฃธ!
        Animal myPet1 = new Dog();
        Animal myPet2 = new Cat();
  
        myPet1.sound(); // ์ถœ๋ ฅ: ๐Ÿถ ๋ฉ๋ฉ!
        myPet2.sound(); // ์ถœ๋ ฅ: ๐Ÿฑ ์•ผ์˜น!
    }
}

โœ… ์ธํ„ฐํŽ˜์ด์Šค ๋‹ค์ค‘๊ตฌํ˜„

  • implements ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•˜๋‚˜์˜ ํด๋ž˜์Šค๊ฐ€ ์—ฌ๋Ÿฌ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Œ.
  • ํ•œ ๊ฐœ์˜ ํด๋ž˜์Šค๊ฐ€ ์—ฌ๋Ÿฌ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ๊ฒฝ์šฐ ๋‹ค์ค‘ ๊ตฌํ˜„ ์ด๋ผ๊ณ  ํ•จ(Animal, Flyable)
  • ์„œ๋กœ ๊ด€๋ จ ์—†๋Š” ๊ธฐ๋Šฅ์„ ์กฐํ•ฉํ•˜์—ฌ ์œ ์—ฐํ•˜๊ณ  ํ™•์žฅ์„ฑ ์žˆ๋Š” ์„ค๊ณ„ ๊ฐ€๋Šฅ!

์ž๋ฐ”์—์„œ๋Š” extends๋ฅผ ์ด์šฉํ•œ ํด๋ž˜์Šค ๋‹ค์ค‘ ์ƒ์†์€ ๋ถˆ๊ฐ€๋Šฅํ•˜์ง€๋งŒ,
implements๋ฅผ ํ™œ์šฉํ•˜๋ฉด ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋™์‹œ์— ๋‹ค์ค‘ ๊ตฌํ˜„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ“Œ ๋‹ค์ค‘๊ตฌํ˜„์˜ˆ์ œ

// โœ… ๋™๋ฌผ ์ธํ„ฐํŽ˜์ด์Šค
interface Animal {
  void sound(); // ๋™๋ฌผ์€ ์†Œ๋ฆฌ๋ฅผ ๋‚ธ๋‹ค
}
// โœ… ๋‚  ์ˆ˜ ์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค
interface Flyable {
  void fly(); // ๋‚  ์ˆ˜ ์žˆ๋‹ค
}

// โœ… ๋ฐ•์ฅ ํด๋ž˜์Šค: Animal, Flyable ๋‘ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ (๋‹ค์ค‘ ๊ตฌํ˜„)
class Bat implements Animal, Flyable {
  @Override
  public void sound() {
      System.out.println("๋ฐ•์ฅ๊ฐ€ ์ดˆ์ŒํŒŒ๋ฅผ ๋ƒ…๋‹ˆ๋‹ค!");
  }

  @Override
  public void fly() {
      System.out.println("๋ฐ•์ฅ๊ฐ€ ๋‚ ์•„๊ฐ‘๋‹ˆ๋‹ค!");
  }
}

public class Main {
  public static void main(String[] args) {
      Bat bat = new Bat(); //  ๋ฐ•์ฅ ๊ฐ์ฒด ์ƒ์„ฑ

      bat.sound(); // ์ถœ๋ ฅ: ๋ฐ•์ฅ๊ฐ€ ์ดˆ์ŒํŒŒ๋ฅผ ๋ƒ…๋‹ˆ๋‹ค!
      bat.fly();   // ์ถœ๋ ฅ: ๋ฐ•์ฅ๊ฐ€ ๋‚ ์•„๊ฐ‘๋‹ˆ๋‹ค!
  }
}

๐Ÿ“Œ Bird ๊ฐ์ฒด๊ฐ€ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ

๊ธฐ๋Šฅ ์„ค๋ช… ์ธํ„ฐํŽ˜์ด์Šค ์˜ˆ์ œ ๋ฉ”์„œ๋“œ
๋‚ ๊ธฐ ํ•˜๋Š˜์„ ๋‚  ์ˆ˜ ์žˆ์Œ Flyable void fly();
์†Œ๋ฆฌ ๋‚ด๊ธฐ ์ง€์ €๊ท (์งน์งน~) Soundable void sound();
๊ฑท๊ธฐ ๋•…์—์„œ ๊ฑธ์–ด ๋‹ค๋‹˜ Walkable void walk();
๋จน๊ธฐ ๋จน์ด๋ฅผ ๋จน์„ ์ˆ˜ ์žˆ์Œ Eatable void eat();

๐Ÿ’Š ์บก์Šํ™”_์ ‘๊ทผ์ œ์–ด์ž

  • ๊ฐ์ฒด์˜ ์ •๋ณด๋ฅผ ์™ธ๋ถ€์—์„œ ์ง์ ‘ ์ ‘๊ทผํ•˜์ง€ ๋ชปํ•˜๋„๋ก ๋ณดํ˜ธํ•˜๋Š” ๊ฐœ๋…์ž„
  • ๋งˆ์น˜ ์บก์Š์ฒ˜๋Ÿผ ๊ฐ์‹ธ์„œ ๋‚ด๋ถ€๋ฅผ ๋ณดํ˜ธํ•˜๊ณ , ์™ธ๋ถ€์—์„œ ๋ถˆํ•„์š”ํ•œ ์ ‘๊ทผ์„ ์ฐจ๋‹จํ•˜๋Š” ๊ฒƒ

โœ… ๋ฐ์ดํ„ฐ ๋ณดํ˜ธ: ์ค‘์š”ํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ์™ธ๋ถ€์—์„œ ์ž„์˜๋กœ ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€
โœ… ์œ ์ง€๋ณด์ˆ˜์šฉ์ด: ๊ฐ์ฒด ๋‚ด๋ถ€ ๋กœ์ง์ด ๋ณ€๊ฒฝ๋˜๋”๋ผ๋„ ์™ธ๋ถ€์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์Œ
โœ… ์ผ๊ด€์„ฑ ์œ ์ง€: ๋ฌด๋ถ„๋ณ„ํ•œ ๋ฐ์ดํ„ฐ ์ˆ˜์ • ๋ฐฉ์ง€

public class Person {      // โœ… ์™ธ๋ถ€์—์„œ ์ ‘๊ทผ ๋ถˆ๊ฐ€ 

  public String name;    // โœ… ์™ธ๋ถ€์—์„œ ์ ‘๊ทผ ๋ถˆ๊ฐ€ 
  private String secret; // โŒ ์™ธ๋ถ€์—์„œ ์ ‘๊ทผ ๋ถˆ๊ฐ€ 
  
  public Person() {}    // โœ… ์™ธ๋ถ€์—์„œ ์ ‘๊ทผ ๋ถˆ๊ฐ€ 

  public void methodA() {}  // โœ… ์™ธ๋ถ€์—์„œ ์ ‘๊ทผ ๊ฐ€๋Šฅ
  private void methodB() {} // โŒ ์™ธ๋ถ€์—์„œ ์ ‘๊ทผ ๋ถˆ๊ฐ€

Person person = new Person(); // โœ… ์ ‘๊ทผ๊ฐ€๋Šฅ ์ƒ์„ฑ์ž๊ฐ€ public
person.name;                  // โœ… ์ ‘๊ทผ๊ฐ€๋Šฅ ๋ณ€์ˆ˜๊ฐ€ public
person.secret;                // โŒ ์ ‘๊ทผ๋ถˆ๊ฐ€๋Šฅ ๋ณ€์ˆ˜๊ฐ€ private
person.methodA();             // โœ… ์ ‘๊ทผ๊ฐ€๋Šฅ ๋ฉ”์„œ๋“œ๊ฐ€ public
person.methodB();             // โŒ ์ ‘๊ทผ๋ถˆ๊ฐ€๋Šฅ ๋ฉ”์„œ๋“œ๊ฐ€ private
์ ‘๊ทผ์ œ์–ด์ž ํด๋ž˜์Šค ๋‚ด๋ถ€ ๊ฐ™์€ ํŒจํ‚ค์ง€ ์ž์‹ ํด๋ž˜์Šค ์ „์ฒด ์ ‘๊ทผ
private โœ… ๊ฐ€๋Šฅ โŒ ๋ถˆ๊ฐ€๋Šฅ โŒ ๋ถˆ๊ฐ€๋Šฅ โŒ ๋ถˆ๊ฐ€๋Šฅ
default โœ… ๊ฐ€๋Šฅ โœ… ๊ฐ€๋Šฅ โŒ ๋ถˆ๊ฐ€๋Šฅ โŒ ๋ถˆ๊ฐ€๋Šฅ
protected โœ… ๊ฐ€๋Šฅ โœ… ๊ฐ€๋Šฅ โœ… ๊ฐ€๋Šฅ โŒ ๋ถˆ๊ฐ€๋Šฅ
public โœ… ๊ฐ€๋Šฅ โœ… ๊ฐ€๋Šฅ โœ… ๊ฐ€๋Šฅ โœ… ๊ฐ€๋Šฅ

๐Ÿ“Œ ๋ฌด๋ถ„๋ณ„ํ•œ ์„ธํ„ฐ

  • Setter๋Š” ๊ผญ ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋งŒ ํ•œ๋‹ค!
  • ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ๋•Œ๋Š” ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค!
  • ๋ถˆ๋ณ€ ๊ฐ์ฒด๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ final์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ’ ๋ณ€๊ฒฝ์„ ๋ง‰๋Š”๋‹ค!
    ๐Ÿ’ก ๋ฌด์กฐ๊ฑด Setter๋ฅผ ๋งŒ๋“ค์ง€ ๋ง๊ณ , ๊ฐ์ฒด์˜ ์•ˆ์ •์„ฑ์„ ๊ณ ๋ คํ•ด์„œ ์„ค๊ณ„ํ•˜๊ธฐ
    โŒ Setter๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์•ˆ ๋˜๋Š” ๊ฒฝ์šฐ โœ… ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•
    ๋ถˆ๋ณ€ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค ๋•Œ final ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ’ ๋ณ€๊ฒฝ์„ ๋ง‰์Œ
    ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ ๋ฐ˜๋“œ์‹œ ํ•„์š”ํ•œ ๊ฐ’์ด ์žˆ์„ ๋•Œ ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ๊ฐ’ ์„ค์ • & ์ดํ›„ ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€
    ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋ฉด ํ”„๋กœ๊ทธ๋žจ ํ๋ฆ„์ด ๋‹ฌ๋ผ์งˆ ๋•Œ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ํฌํ•จํ•œ ๋ฉ”์„œ๋“œ(deposit() ๋“ฑ) ์‚ฌ์šฉ

๐Ÿ“Œ ์„ธํ„ฐ ํ™œ์šฉ ์˜ˆ์‹œ

public class BankAccount {
  private int balance; // ๊ณ„์ขŒ ์ž”์•ก

  public BankAccount(int balance) { // ์ดˆ๊ธฐ ์ž”์•ก ์„ค์ •
      this.balance = balance;
  }

  public int getBalance() {
      return balance;
  }

  // โœ… ์˜ˆ์ œ: ์ž…๊ธˆ ๋ฉ”์„œ๋“œ (์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ์ถ”๊ฐ€)
  public void deposit(int amount) {
      if (amount > 0) {
          balance += amount;
      }
  }

  // โŒ ์ž˜๋ชป๋œ Setter (์ž”์•ก์„ ๋งˆ์Œ๋Œ€๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Œ โ†’ ์ œ๊ฑฐ!)
  // public void setBalance(int balance) {
  //     this.balance = balance;
  // }
}

๐Ÿ“Œ ๊ฒŒํ„ฐ ํ™œ์šฉ ์˜ˆ์‹œ

public class Person { 
  private String secret;
   public String getSecret() {
		    return this.secret; // โœ… ๊ฐ์ฒด์˜ secret ์†์„ฑ ๋ฐ˜ํ™˜
  }
}
public class Main {
  public static void main(String[] args) {
		    Person p1 = new Person();
		    p1.secret; // โŒ ์ง์ ‘ ์ ‘๊ทผ ๋ถˆ๊ฐ€๋Šฅ
		    String newSecret = p1.getSecret(); // โœ… ๊ฒŒํ„ฐ๋ฅผ ํ™œ์šฉํ•ด ์ ‘๊ทผ๊ฐ€๋Šฅ
  }
}

๐Ÿ“’ ์บก์Š + ๊ฒŒํ„ฐ์™€์„ธํ„ฐ ํ™œ์šฉ

  • ๊ฐ์ฒด์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์™ธ๋ถ€์—์„œ ๋ง‰ ๋ณ€๊ฒฝํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ๋ณดํ˜ธํ•˜๊ธฐ ์œ„ํ•ด!
  • ์ง์ ‘ ๊ฐ’์„ ๋ฐ”๊พธ๋ฉด ์‹ค์ˆ˜ํ•  ์ˆ˜๋„ ์žˆ์œผ๋‹ˆ๊นŒ, Setter์—์„œ "์œ ํšจ์„ฑ ๊ฒ€์‚ฌ" ๋ฅผ ํ•  ์ˆ˜ ์žˆ์Œ!
    = ์ฆ‰ ๋ฐ์ดํ„ฐ ๋ณดํ˜ธ + ์กฐ์ ˆ์ž„!!
    โœ”๏ธ Getter (getX()) โ†’ ๋ณ€์ˆ˜๋ฅผ ์ฝ๋Š” ํ•จ์ˆ˜
    โœ”๏ธ Setter (setX()) โ†’ ๋ณ€์ˆ˜๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ํ•จ์ˆ˜

    ๐Ÿ“Œ ์˜ˆ์‹œ: "๋ƒ‰์žฅ๊ณ ์—์„œ ์šฐ์œ  ๊บผ๋‚ด๊ธฐ"
    Getter = ์šฐ์œ ๊ฐ€ ์–ผ๋งˆ๋‚˜ ๋‚จ์•˜๋Š”์ง€ ๋ณด๊ธฐ
    Setter = ์šฐ์œ ๋ฅผ ์ƒˆ๋กœ ์‚ฌ์„œ ์ฑ„์šฐ๊ธฐ

๊ธฐ๋Šฅ Getter (getX()) Setter (setX())
์—ญํ•  ๋ณ€์ˆ˜๋ฅผ ์ฝ์„ ๋•Œ ์‚ฌ์šฉ ๋ณ€์ˆ˜๋ฅผ ๋ณ€๊ฒฝํ•  ๋•Œ ์‚ฌ์šฉ
์ ‘๊ทผ ์™ธ๋ถ€์—์„œ ์ฝ๊ธฐ ๊ฐ€๋Šฅ ์™ธ๋ถ€์—์„œ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ
์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ์—†์Œ ์ถ”๊ฐ€ ๊ฐ€๋Šฅ (์ž˜๋ชป๋œ ๊ฐ’ ๊ฑฐ๋ถ€ ๊ฐ€๋Šฅ)
ํ™œ์šฉ ์˜ˆ์‹œ getName(), getAge() setName(), setAge()

1๏ธโƒฃ ๐Ÿ“Œ Getter & Setter ๋ฐ์ดํ„ฐ์ ‘๊ทผ ์˜ˆ์ œ

class Person {
    private String name;  // โœ… private โ†’ ์ง์ ‘ ์ ‘๊ทผ โŒ

    // โœ… Getter (๊ฐ’ ์ฝ๊ธฐ)
    public String getName() {
        return name;
    }

    // โœ… Setter (๊ฐ’ ๋ณ€๊ฒฝ)
    public void setName(String newName) {
        this.name = newName;
    }
}

public class Main {
    public static void main(String[] args) {
        Person person = new Person();

        person.setName("์ง€์—ฐ");  // ์ด๋ฆ„ ์„ค์ • (Setter ์‚ฌ์šฉ)
        System.out.println("์ด๋ฆ„: " + person.getName()); // ์ถœ๋ ฅ: ์ด๋ฆ„: ์ง€์—ฐ
    }
}

  
โœ”๏ธ Getter (getName()) ์„ ์‚ฌ์šฉํ•ด name ๊ฐ’์„ ์ฝ์„ ์ˆ˜ ์žˆ์Œ
โœ”๏ธ Setter (setName()) ์„ ์‚ฌ์šฉํ•ด name ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Œ


2๏ธโƒฃ Setter์—์„œ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ(์ž˜๋ชป๋œ ๊ฐ’ ๋ฐฉ์ง€ํ•˜๊ธฐ์œ„ํ•จ)
โŒ ๋‚˜์ด๋ฅผ ์Œ์ˆ˜๋กœ ์„ค์ •ํ•  ์ˆ˜ ์—†๋„๋ก ๋ณดํ˜ธํ•˜๊ธฐ!โŒ

class Person {
    private int age;

    // โœ… Getter (๋‚˜์ด ์กฐํšŒ)
    public int getAge() {
        return age;
    }

    // โœ… Setter (๋‚˜์ด ๋ณ€๊ฒฝ)
    public void setAge(int newAge) {
        if (newAge >= 0) {  // ๐Ÿ”ด 0 ์ด์ƒ๋งŒ ๊ฐ€๋Šฅํ•˜๋„๋ก ์„ค์ •
            this.age = newAge;
        } else {
            System.out.println("โŒ ๋‚˜์ด๋Š” 0 ์ด์ƒ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค!");
        }
    }
}

public class Main {
    public static void main(String[] args) {
        Person person = new Person();

        person.setAge(25);  // โœ… ์ •์ƒ์ ์ธ ๊ฐ’ ์ž…๋ ฅ
        System.out.println("๋‚˜์ด: " + person.getAge()); // ์ถœ๋ ฅ: ๋‚˜์ด: 25

        person.setAge(-5);  // โŒ ์ž˜๋ชป๋œ ๊ฐ’ ์ž…๋ ฅ โ†’ ๊ฒฝ๊ณ  ๋ฉ”์‹œ์ง€ ์ถœ๋ ฅ
    }
}
โœ… ์ถœ๋ ฅ๊ฐ’
๋‚˜์ด: 25
๋‚˜์ด๋Š” 0 ์ด์ƒ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค!  //โŒ ์„ธํ„ฐ์—์„œ ๊ฐ’์ด ์ด์ƒํ•˜๋ฉด ๊ฑฐ๋ถ€ํ•˜๋„๋ก ์„ค์ • ๊ฐ€๋Šฅ!

3๏ธโƒฃ Getter๋งŒ ์ œ๊ณตํ• ๊ฒฝ์šฐ (์ฝ๊ธฐ์ „์šฉ๋ณ€์ˆ˜/๋ณด๊ธฐ๋งŒํ•˜์…ˆ-_-)
โœ”๏ธ ํ•œ ๋ฒˆ ์ •ํ•ด์ง€๋ฉด ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋Š” ๋ฐ์ดํ„ฐ๋Š” Setter ์—†์ด Getter๋งŒ ์ œ๊ณต!

class User {
    private final String id;  // โœ… ID๋Š” ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅ

    public User(String id) {  // โœ… ์ƒ์„ฑ์ž๋กœ ID ์„ค์ •
        this.id = id;
    }

    // โœ… Getter๋งŒ ์ œ๊ณต (Setter ์—†์Œ)
    public String getId() {
        return id;
    }
}

public class Main {
    public static void main(String[] args) {
        User user = new User("user123");
        System.out.println("์‚ฌ์šฉ์ž ID: " + user.getId()); // ์ถœ๋ ฅ: ์‚ฌ์šฉ์ž ID: user123

        // โŒ user.setId("newID");  โ†’ ์ปดํŒŒ์ผ ์—๋Ÿฌ ๋ฐœ์ƒ!
    }
}
  
โœ… ์ถœ๋ ฅ๊ฐ’

์‚ฌ์šฉ์ž ID: user123

๐Ÿ“’ ์ƒ์† (๋ถ€๋ชจ,์ž์‹ํด๋ž˜์Šค)

  • ํด๋ž˜์Šค๊ฐ„ ๊ด€๊ณ„๋ฅผ ๋ถ€๋ชจ/์ƒ์œ„, ์ž์‹/ํ•˜์œ„, ๋กœ ๋ฐ”๋ผ๋ณด๋Š” ๊ฐœ๋…
  • ์ƒ์†์—์„œ๋Š” ์žฌ์‚ฌ์šฉ์„ฑ, ํ™•์žฅ ์ด ๊ฐ€๋Šฅํ•จ๐ŸŒŸ ์ค‘์š”ํ‚ค์›Œ๋“œ
    โ†’ ๋ฌผ๋ ค๋ฐ›์€ ์†์„ฑ๊ณผ ๊ธฐ๋Šฅ์€ ์ž์‹ ํด๋ž˜์Šค์—์„œ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜๋„,ํ™•์žฅํ• ์ˆ˜๋„์žˆ์Œ
  • extends ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ƒ์†๊ด€๊ณ„๋ฅผ ๊ตฌํ˜„ํ•จ
  • ๊ฐ์ฒด์ง€ํ–ฅ์˜ ์ค‘์š”ํ•œ ๊ฐœ๋… ์ถ”์ƒํ™”, ๋‹คํ˜•์„ฑ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐ ํ™œ์šฉ๋จ

๊ณตํ†ต๋œ ๊ธฐ๋Šฅ์ด๋‚˜ ์†์„ฑ์„ ์ž์‹ ํด๋ž˜์Šค๋“ค์—๊ฒŒ ์ œ๊ณตํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉํ•จ
๋ถ€๋ชจ ํด๋ž˜์Šค์—์„œ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋‚˜ ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜
์ž์‹ ํด๋ž˜์Šค๋“ค์ด ์ƒ์†๋ฐ›์•„ ์žฌ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ธฐ์–ตํ•˜๋ฉดํ•˜๊ธฐ. ์˜คํ‚ค์ง€์—ฐ?
= ์ค‘๋ณต์„ ์ค„์ด๊ณ  ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ๋ถ€๋ชจํด๋ž˜์Šค๋งŒ ์ˆ˜์ •ํ•˜๋ฉด ์ž์‹ ํด๋ž˜์Šค์—๋„ ์ž๋™์œผ๋กœ ์ ์šฉ๋˜๋ฏ€๋กœ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์‰ฌ์›Œ์งˆ์ˆ˜์žˆ๋‹คํ•จ

๐Ÿ“Œ ์ƒ์† ์˜ˆ์‹œ_๋ฌธ์ž์—ด

// 1๏ธโƒฃ ๋ถ€๋ชจ ํด๋ž˜์Šค
public class Parent { 
  public String familyName = "์ŠคํŒŒ๋ฅดํƒ„";
  public int honor = 10;

  public void introduceFamily() {
      System.out.println("์šฐ๋ฆฌ " + this.familyName + " ๊ฐ€๋ฌธ์€ ๋Œ€๋Œ€๋กœ ๋ช…์„ฑ์„ ์ด์–ด์˜จ...");
  }
}
// 2๏ธโƒฃ ์ž์‹ ํด๋ž˜์Šค (์ƒ์†)
class Child extends Parent { // โœ… extends ํ‚ค์›Œ๋“œ ํ™œ์šฉ
}

3๏ธโƒฃ  Main ํด๋ž˜์Šค (์‹คํ–‰ ํด๋ž˜์Šค)
public class Main {
  public static void main(String[] args) {
        // ์ž์‹ ํด๋ž˜์Šค ๊ฐ์ฒด ์ƒ์„ฑ
      Child child = new Child(); // Child ์ƒ์„ฑ์ž ํ˜ธ์ถœ
      System.out.println(child.honor); // โœ… ๋ถ€๋ชจ ์†์„ฑ ์‚ฌ์šฉ
      child.introduceFamily(); // โœ… ๋ถ€๋ชจ ๋ฉ”์„œ๋“œ ์‚ฌ์šฉ
  }
}
โœ… ์ถœ๋ ฅ๊ฐ’
๋ถ€๋ชจ ํด๋ž˜์Šค ์ƒ์„ฑ์ž ํ˜ธ์ถœ!
์ž์‹ ํด๋ž˜์Šค ์ƒ์„ฑ์ž ํ˜ธ์ถœ!
์šฐ๋ฆฌ ๊ฐ€๋ฌธ์˜ ์ด๋ฆ„์€ ๊น€
์›๋ž˜ ๊ฐ€๋ฌธ์˜ ์ด๋ฆ„์€ ์ŠคํŒŒ๋ฅดํƒ„

โœ”๏ธ extends  ์ž์‹ ํด๋ž˜์Šค์—์„œ ๋ถ€๋ชจ ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›์„ ๋•Œ ์‚ฌ์šฉ
โœ”๏ธ super() ์ž์‹ ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž์—์„œ ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœ( ์ƒ๋žต ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ๋ช…์‹œ์ ์œผ๋กœ ํ˜ธ์ถœํ•˜๋ฉด ๋ถ€๋ชจ๊ฐ€ ๋จผ์ € ์‹คํ–‰๋œ๋‹คํ•จ/์ฐธ๊ณ )
โœ”๏ธ this ์ž์‹ ํด๋ž˜์Šค ์ž์‹ ์˜ ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•  ๋•Œ ์‚ฌ์šฉ, ์ž์‹ ์„ ๊ฐ€๋ฅดํ‚ด
โœ”๏ธ super ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•  ๋•Œ ์‚ฌ์šฉ

๐Ÿ“Œ ์ƒ์† ์˜ˆ์‹œ_๋ฌธ์ž์—ด

1๏ธโƒฃ ๋ถ€๋ชจ ํด๋ž˜์Šค  
class Parent {
    // ๋ถ€๋ชจ ํด๋ž˜์Šค์—์„œ ๋ฌธ์ž์—ด ๋ณ€์ˆ˜ ์ •์˜
    String familyName = "์ŠคํŒŒ๋ฅดํƒ„";  // ๋ฌธ์ž์—ด ๋ณ€์ˆ˜
    int age = 50;  //  ์ˆซ์ž ๋ณ€์ˆ˜ ์ •์˜
  
    boolean isActive = true;  // ๋ถ€๋ชจ ํด๋ž˜์Šค์—์„œ ๋ถˆ๋ฆฐ ๋ณ€์ˆ˜
} 
class Parent {
    String familyName = "์ŠคํŒŒ๋ฅดํƒ„";  // ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ๋ณ€์ˆ˜
    int age = 50;  // ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ๋ณ€์ˆ˜
}
2๏ธโƒฃ ์ž์‹ ํด๋ž˜์Šค (์ƒ์†)
class Child extends Parent {  // ๋ถ€๋ชจ ํด๋ž˜์Šค ์ƒ์†
    public void showInfo() {
        // ์ž์‹ ํด๋ž˜์Šค์—์„œ ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ๋ณ€์ˆ˜ ์‚ฌ์šฉ
        System.out.println("์šฐ๋ฆฌ ๊ฐ€๋ฌธ์˜ ์ด๋ฆ„์€ " + familyName);  // ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ familyName ์‚ฌ์šฉ
        System.out.println("๋ถ€๋ชจ์˜ ๋‚˜์ด๋Š” " + age);  // ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ age ์‚ฌ์šฉ
    }
}
3๏ธโƒฃ  Main ํด๋ž˜์Šค (์‹คํ–‰ ํด๋ž˜์Šค)
public class Main {
    public static void main(String[] args) {
        Child child = new Child();
        child.showInfo();  // ์ž์‹ ํด๋ž˜์Šค์—์„œ ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ๋ณ€์ˆ˜ ์ถœ๋ ฅ
    }
}
  
โœ… ์ถœ๋ ฅ ๊ฐ’
๋ถ€๋ชจ์˜ ๋‚˜์ด๋Š” 50

๐Ÿ”– ๋ถ€๋ชจ ๋ฉ”์„œ๋“œ ๋ณ€์ˆ˜ ์ฐธ์กฐ(super,this)

ํ•ต์‹ฌ ๐Ÿ’ซ
this๋Š” ์ž์‹ ํด๋ž˜์Šค์˜ ๋ฉค๋ฒ„๋ฅผ, super๋Š” ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ๋ฉค๋ฒ„๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ์ฐธ์กฐํ•  ๋•Œ ์‚ฌ์šฉํ•˜์ž! ์•Œ์•˜์–ด? ๋ฐ•์ง€ใ…‡ใ…•ใ„ด!???

1๏ธโƒฃ this ํ‚ค์›Œ๋“œ

  • this. ์ž์‹ ํด๋ž˜์Šค์˜ ๊ฐ์ฒดํ‚ด
  • ์ž์‹ ํด๋ž˜์Šค์—์„œ ์ž์‹ํด๋ž˜์Šค์˜ ๋ณ€์ˆ˜๋‚˜ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์‚ฌ์šฉ
 class Child {
    String name = "์ž์‹";  // โœ… ์ž์‹ ํด๋ž˜์Šค์˜ ๋ณ€์ˆ˜
    public void printName() {
        System.out.println("์ž์‹ ํด๋ž˜์Šค์—์„œ ํ˜ธ์ถœ: " + this.name);  // โœ… this. ์ž์‹ ํด๋ž˜์Šค ๋ณ€์ˆ˜ โญ๏ธ
    }
}

2๏ธโƒฃ super ํ‚ค์›Œ๋“œ

  • super๋Š” ๋ถ€๋ชจ ํด๋ž˜์Šค๋ฅผ ๊ฐ€๋ฆฌํ‚ด
  • ์ž์‹ ํด๋ž˜์Šค์—์„œ ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ๋ณ€์ˆ˜๋‚˜ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์‚ฌ์šฉํ•˜๊ธฐ
class Parent {
    String name = "๋ถ€๋ชจ";  // โœ… ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ๋ณ€์ˆ˜
}

class Child extends Parent {
    String name = "์ž์‹";  // โœ… ์ž์‹ ํด๋ž˜์Šค์˜ ๋ณ€์ˆ˜
    
    public void printName() {
        System.out.println("๋ถ€๋ชจ ํด๋ž˜์Šค์—์„œ ํ˜ธ์ถœ: " + super.name);  // โœ… super. ๋ถ€๋ชจ ํด๋ž˜์Šค ๋ณ€์ˆ˜ โญ๏ธ
    }
}

๐Ÿ”– ํด๋ž˜์Šค ์ƒ์„ฑ์ž ํ˜ธ์ถœ (super(),this())

ํ•ต์‹ฌ ๐Ÿ’ซ
super()๋Š” ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœ, this()๋Š” ์ž์‹ ํด๋ž˜์Šค ๋‚ด์—์„œ ๋‹ค๋ฅธ ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ์‚ฌ์šฉํ•จ

1๏ธโƒฃ this() ํ‚ค์›Œ๋“œ

  • this()๋Š” ์ž์‹ ํด๋ž˜์Šค ๋‚ด์—์„œ ๋‹ค๋ฅธ ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœํ• ๋•Œ ์‚ฌ์šฉ
    ๐Ÿ“‹...์ดํ•ด ์•ˆ ๋์Œ.. ๋” ์ฐพ์•„๋ด„..
    • this()๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ž์‹ ํด๋ž˜์Šค ๋‚ด์—์„œ ๋‹ค๋ฅธ ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœํ• ์ˆ˜์žˆ๋‹ค์ž„ ๋‹ค์‹œ..์ˆœ์„œ๋ฅผ ์ฐจ๊ทผ์ฐจ๊ทผ ์ƒ๊ฐํ•ด๋ณด์ž.์ง€์—ฐ ์ด๋Ÿด์ˆ˜๋„ ์žˆ์–ด ๊ดœ์ฐฎ์•„!
    1. ์ž์‹ ํด๋ž˜์ŠคChild ์—๋Š” 2๊ฐœ์˜ ์ƒ์„ฑ์ž๊ฐ€์žˆ์–ด.
      1.1 Child() this("๊ธฐ๋ณธ์ด๋ฆ„")๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ž์‹ ํด๋ž˜์Šค ๊ธฐ๋ณธ ์ƒ์„ฑ์ž ํ˜ธ์ถœํ•˜๋Š” ๋…€์„
      1.2 Child(String name)๋ฌธ์ž์—ด ์ถœ๋ ฅํ•˜๋Š”๋…€์„ ์˜คํ‚ค ์ด๊ฑด ์•„๊นŒ๋ถ€ํ„ฐ ์•Œ์•˜์–ด.
    2. Main ํด๋ž˜์Šค์—์„œ new Child() ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š”๊ฑฐ์•ผ!!์ด์ œ ๋ถˆ๋Ÿฌ!
      2.1 Child child = new Child(); (ํด๋ž˜์Šค๋ช…/๊ฐ์ฒด๋ช… = new ํด๋ž˜์Šค๋ช…;)
 //๋ถ€๋ชจํด๋ž˜์Šค 
class Child {
    Child() {
        this("๊ธฐ๋ณธ ์ด๋ฆ„");  // โœ… this() ๋‹ค๋ฅธ ์ƒ์„ฑ์ž ํ˜ธ์ถœ โญ๏ธ
        System.out.println("์ž์‹ ํด๋ž˜์Šค ๊ธฐ๋ณธ ์ƒ์„ฑ์ž ํ˜ธ์ถœ");
    }
   Child(String name) {
        System.out.println(name + "์œผ๋กœ ์ž์‹ ํด๋ž˜์Šค ์ƒ์„ฑ");
    }
}
 //๋ฉ”์ธ ์‹คํ–‰ํด๋ž˜์Šค
  public class Main {
    public static void main(String[] args) {
        Child child = new Child();  // ์ฒซ ๋ฒˆ์งธ ์ƒ์„ฑ์ž๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด์„œ ๋‘ ๋ฒˆ์งธ ์ƒ์„ฑ์ž ํ˜ธ์ถœ
    }
}

2๏ธโƒฃ super() ํ‚ค์›Œ๋“œ

  • super()๋Š” ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ์‚ฌ์šฉ
  • ์ž์‹ ํด๋ž˜์Šค์—์„œ ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž๊ฐ€ ํ•„์š”ํ•˜๋ฉด super()๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ํ•ด์•ผํ•จ!
  //๋ถ€๋ชจํด๋ž˜์Šค
class Parent {
    Parent() {
        System.out.println("๋ถ€๋ชจ ํด๋ž˜์Šค ์ƒ์„ฑ์ž");
    }
}
//๋ฉ”์ธ์‹คํ–‰ํด๋ž˜์Šค
class Child extends Parent {
    Child() {
        super();  // โœ… ๋ถ€๋ชจ ํด๋ž˜์Šค ์ƒ์„ฑ์ž ํ˜ธ์ถœ โญ๏ธ
        System.out.println("์ž์‹ ํด๋ž˜์Šค ์ƒ์„ฑ์ž");
    }
}


๐Ÿ“ฃ ์ƒ์† ๊ธฐ๋Šฅ ํ™•์žฅ

  • ๋ถ€๋ชจํด๋ž˜์Šค์˜ ๊ธฐ๋Šฅ์„ ์œ ์ง€ํ•˜๋ฉด์„œ ์ž์‹ํด๋ž˜์Šค์—์„œ ๊ธฐ๋Šฅ์„ ํ™•์žฅ์ˆ˜์žˆ์Œ(๊ฐœ๋Œ?)
  • ์ž์‹ํด๋ž˜์Šค์—์„œ ์ƒˆ๋กœ์šด ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ๋ถ€๋ชจํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์ˆ˜์ •ํ• ์ˆ˜์žˆ์Œ
  • ์ž์‹ํด๋ž˜์Šค๋Š” ๋ถ€๋ชจํด๋ž˜์Šค์˜ ๋ฉค๋ฒ„(๋ณ€์ˆ˜, ๋ฉ”์„œ๋“œ)๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ  ํ•„์š”์‹œ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ• ์ˆ˜์žˆ์Œ
    โŒ๋„ˆ ๋ฐ•์ง€์—ฐ ๋งค์„œ๋“œ ์ •์˜ํ• ๋Œ€ ์นด๋ฉœํ‘œ๊ธฐ์ €๊ฑฐ์žŠ์ง€๋งˆ๋ผgetUserInfo() ์•Œ์ง€?
  // 1๏ธโƒฃ Parent ํด๋ž˜์Šค (๋ถ€๋ชจ ํด๋ž˜์Šค)
class Parent {
    String name = "๋ถ€๋ชจ";  // โœ…๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ๋ณ€์ˆ˜
}
// 2๏ธโƒฃChild ํด๋ž˜์Šค (์ž์‹ ํด๋ž˜์Šค)
class Child extends Parent {
    String name = "์ž์‹";  // โœ… ์ž์‹ ํด๋ž˜์Šค์˜ ๋ณ€์ˆ˜
  
  public void printName() { โœ…  printName() ๋งค์„œ๋“œ ์ •์˜
        System.out.println("๋ถ€๋ชจ์˜ ์ด๋ฆ„: " + super.name);  // ๋ถ€๋ชจ ํด๋ž˜์Šค์˜  ๋ณ€์ˆ˜
        System.out.println("์ž์‹์˜ ์ด๋ฆ„: " + this.name);  // ์ž์‹ ํด๋ž˜์Šค์˜ ๋ณ€์ˆ˜
    }
}
// 3๏ธโƒฃ Main ํด๋ž˜์Šค (์‹คํ–‰ ํด๋ž˜์Šค)
public class Main {
    public static void main(String[] args) {
        Child child = new Child();  // โœ… ์ž์‹ ํด๋ž˜์Šค ๊ฐ์ฒด ์ƒ์„ฑ
        child.printName();  // โœ… printName ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ
    }
}

๐Ÿ“– ์žฌ์ •์˜ ์˜ค๋ฒ„๋ผ์ด๋”ฉ

  • ์˜ค๋ฒ„๋ผ์ด๋”ฉ์€ ์ž์‹ ํด๋ž˜์Šค์—์„œ ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์ƒˆ๋กญ๊ฒŒ ์ •์˜ํ•˜๋Š”๊ฒƒ!
  • ๋ถ€๋ชจ ํด๋ž˜์Šค์—์„œ ์ •์˜๋œ ๋ฉ”์„œ๋“œ๋ฅผ ์ž์‹ ํด๋ž˜์Šค์—์„œ ๋‹ค๋ฅด๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Œ

๐Ÿ’ก ๋ถ€๋ชจ ํด๋ž˜์Šค์—์„œ ์ •์˜๋œ ๋ฉ”์„œ๋“œ๋ฅผ ์ž์‹ ํด๋ž˜์Šค์—์„œ ๋‹ค๋ฅด๊ฒŒ ๊ตฌํ˜„ํ•˜๋Š”๊ฒƒ
1. @Override ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ถ€๋ชจ ํด๋ž˜์Šค์— ๋ฉ”์„œ๋“œ๊ฐ€ ์—†์œผ๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์•Œ๋ ค์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์ˆ˜๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.
2. ๋ฉ”์„œ๋“œ ์ด๋ฆ„, ๋งค๊ฐœ๋ณ€์ˆ˜, ๋ฐ˜ํ™˜ ํƒ€์ž…์€ ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ์™€ ์™„์ „ํžˆ ๋™์ผํ•ด์•ผํ•จ

๐Ÿ“Œ ์˜ค๋ฒ„๋ผ์ด๋”ฉ ์˜ˆ์‹œ

 // ๋ถ€๋ชจ ํด๋ž˜์Šค
class Animal {
    void makeSound() {
        System.out.println("๋™๋ฌผ์ด ์†Œ๋ฆฌ๋ฅผ ๋‚ธ๋‹ค.");
    }
}
// ์ž์‹ ํด๋ž˜์Šค Dog
class Dog extends Animal {
    @Override  // ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉ
    void makeSound() {
        System.out.println("๋ฉ๋ฉ!");
    }
}
// ์ž์‹ ํด๋ž˜์Šค Cat
class Cat extends Animal {
    @Override  // ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉ
    void makeSound() {
        System.out.println("์•ผ์˜น!");
    }
}
//๋ฉ”์ธ ์‹คํ–‰ ํด๋ž˜์Šค
public class Main {
    public static void main(String[] args) {
        // Animal ํƒ€์ž… ๋ณ€์ˆ˜๋กœ ๊ฐ์ฒด ์ƒ์„ฑ
        Animal myDog = new Dog();  // Dog ๊ฐ์ฒด
        Animal myCat = new Cat();  // Cat ๊ฐ์ฒด
              
        myDog.makeSound();  // "๋ฉ๋ฉ!" 
        myCat.makeSound();  // "์•ผ์˜น!"  
 โœ… ์ถœ๋ ฅ ๊ฐ’   
  "๋ฉ๋ฉ!"
  "์•ผ์˜น!"
  }
}

๐Ÿ“™ ์ถ”์ƒํด๋ž˜์Šค

  • ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์—†๋Š” ํด๋ž˜์Šค๋กœ ์„ค๊ณ„๋„ ์—ญํ• ์„ ํ•จ
  • ์ž์‹ ํด๋ž˜์Šค์—๊ฒŒ ๋ฐ˜๋“œ์‹œ ๊ตฌํ˜„ํ•ด์•ผ ํ•  ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ•์ œ๋กœ ์ง€์ •ํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉํ•จ
  • abstract ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ถ”์ƒ ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ• ์ˆ˜์žˆ์Œ
  • ๐Ÿ™…โ€โ™€๏ธ์ถ”์ƒํด๋ž˜์Šค๋กœ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ• ์ˆœ์—†์Œ
  • ์ถ”์ƒ ๋ฉ”์„œ๋“œ๋Š” ์ž์‹ ํด๋ž˜์Šค์—์„œ ๊ตฌํ˜„ํ•ด์•ผํ•จ

    ๐Ÿ’ก์ถ”์ƒ ๋ฉ”์„œ๋“œ๋Š” ์„ ์–ธ๋งŒ ํ•˜๊ณ  ๊ตฌํ˜„๋ถ€ {}๋Š” ์ž‘์„ฑํ•˜์ง€์•Š๋Š”๋‹ค!
    void makeSound(); โ† ์—ฌ๊ธฐ๊นŒ์ง€๋งŒ ์ž…๋ ฅํ•˜๋Š” ๋Š๋‚Œ

// 1๏ธโƒฃ ์ถ”์ƒ ํด๋ž˜์Šค
abstract class Animal {
    // ์ถ”์ƒ ๋ฉ”์„œ๋“œ (์ž์‹ ํด๋ž˜์Šค์—์„œ ๊ตฌํ˜„ํ•ด์•ผ ํ•จ)
    abstract void makeSound();
}
// 2๏ธโƒฃ ์ž์‹ ํด๋ž˜์Šค
class Dog extends Animal {
    @Override
    void makeSound() {
        System.out.println("๋ฉ๋ฉ!");
    }
}
3๏ธโƒฃ Main ํด๋ž˜์Šค (์‹คํ–‰ ํด๋ž˜์Šค)
public class Main {
    public static void main(String[] args) {
        Animal dog = new Dog();
        dog.makeSound();  // "๋ฉ๋ฉ!" ์ถœ๋ ฅ
    }
}

๐Ÿ“Œ ๐ŸŽฏ ์ถ”์ƒ ํด๋ž˜์Šค vs ์ธํ„ฐํŽ˜์ด์Šค ๋น„๊ต ํ‘œ

๊ฐ™์€๊ฒƒ๊ฐ™์ง€๋งŒ ๋‹ค๋ฅธ,,๋„˜,,

ํŠน์„ฑ ์ถ”์ƒ ํด๋ž˜์Šค (Abstract Class) ์ธํ„ฐํŽ˜์ด์Šค (Interface)
์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜ O (๋ฉค๋ฒ„ ๋ณ€์ˆ˜ ์„ ์–ธ ๊ฐ€๋Šฅ) X (๋ฉค๋ฒ„ ๋ณ€์ˆ˜ ์„ ์–ธ ๋ถˆ๊ฐ€๋Šฅ)
๋ฉ”์„œ๋“œ ๊ตฌํ˜„ O (์ผ๋ฐ˜ ๋ฉ”์„œ๋“œ + ์ถ”์ƒ ๋ฉ”์„œ๋“œ) X (๊ธฐ๋ณธ์ ์œผ๋กœ ๋ชจ๋“  ๋ฉ”์„œ๋“œ๋Š” ์ถ”์ƒ ๋ฉ”์„œ๋“œ)
๋‹ค์ค‘ ์ƒ์† X (ํ•˜๋‚˜๋งŒ ์ƒ์† ๊ฐ€๋Šฅ) O (์—ฌ๋Ÿฌ ๊ฐœ ๊ตฌํ˜„ ๊ฐ€๋Šฅ)
์‚ฌ์šฉ ๋ชฉ์  ๊ณ„์ธต ๊ตฌ์กฐ ํ‘œํ˜„ (๊ณตํ†ต ์†์„ฑ, ๊ธฐ๋Šฅ ์žฌ์‚ฌ์šฉ) ๊ณตํ†ต๋œ ๊ธฐ๋Šฅ์„ ์ •์˜ (ํ‘œ์ค€ ์ œ๊ณต)
์ƒ์„ฑ์ž ์‚ฌ์šฉ O (์ƒ์„ฑ์ž ์„ ์–ธ ๊ฐ€๋Šฅ) X (์ƒ์„ฑ์ž ์„ ์–ธ ๋ถˆ๊ฐ€๋Šฅ)
ํ‚ค์›Œ๋“œ abstract ํ‚ค์›Œ๋“œ ์‚ฌ์šฉ interface ํ‚ค์›Œ๋“œ ์‚ฌ์šฉ
์ ‘๊ทผ ์ œ์–ด์ž O (public, protected, private ์‚ฌ์šฉ ๊ฐ€๋Šฅ) X (๋ชจ๋“  ๋ฉ”์„œ๋“œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ public)

โœ”๏ธ ์ถ”์ƒ ํด๋ž˜์Šค๋Š” ๋ถ€๋ชจ-์ž์‹ ๊ด€๊ณ„๋ฅผ ๋งŒ๋“ค๊ณ  ๊ณตํ†ต ์†์„ฑ๊ณผ ๊ธฐ๋Šฅ์„ ๋ฌผ๋ ค์ฃผ๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ

โœ”๏ธ ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๋‹ค์ค‘ ๊ตฌํ˜„์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ ์—ฌ๋Ÿฌ ํด๋ž˜์Šค์—์„œ ๋™์ผํ•œ ๊ธฐ๋Šฅ์„ ๊ฐ•์ œํ•  ๋•Œ ์‚ฌ์šฉ


๐Ÿ“˜ ์ถ”์ƒํ™” (Abstraction)

  • ์ถ”์ƒํ™”๋ž€ ๋ถˆํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ๋ณธ์งˆ์ ์ธ ํŠน์ง•๋งŒ ๋‚จ๊ธฐ๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•จ
  • ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ๋Š” ์ถ”์ƒํ™”์˜ ๊ณ„์ธต์  ํŠน์ง•์„ ํ™œ์šฉํ•˜์—ฌ ์œ ์ง€๋ณด์ˆ˜์„ฑ์ด ์ข‹์€ ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Œ
  • ์ธํ„ฐํŽ˜์ด์Šค ์ƒ์†๊ณผ ํด๋ž˜์Šค ์ƒ์†์„ ํ™œ์šฉํ•˜์—ฌ ์ถ”์ƒ ๊ณ„์ธต์„ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์Œ
  • ์ถ”์ƒํ™”์˜ ํŠน์ง•์€ ๋‹คํ˜•์„ฑ์—์„œ ๋”์šฑ ๊ฐ•๋ ฅํ•˜๊ฒŒ ํ™œ์šฉ๋จ

โœ”๏ธ ์ถ”์ƒํ™”์˜ ํ•ต์‹ฌ ๊ฐœ๋…

๊ฐœ๋… ์„ค๋ช…
์ถ”์ƒํ™”(Abstraction) ๋ถˆํ•„์š”ํ•œ ์„ธ๋ถ€ ๊ตฌํ˜„์„ ์ˆจ๊ธฐ๊ณ  ํ•ต์‹ฌ์ ์ธ ๋ถ€๋ถ„๋งŒ ๋…ธ์ถœํ•˜๋Š” ๊ฐœ๋…
์ถ”์ƒ ํด๋ž˜์Šค(Abstract Class) abstract ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ณตํ†ต ๊ธฐ๋Šฅ์„ ์ •์˜ํ•˜๊ณ , ์ผ๋ถ€ ๋ฉ”์„œ๋“œ๋ฅผ ์ž์‹ ํด๋ž˜์Šค์—์„œ ๊ตฌํ˜„ํ•˜๋„๋ก ๊ฐ•์ œํ•˜๋Š” ํด๋ž˜์Šค
์ธํ„ฐํŽ˜์ด์Šค(Interface) ๋ชจ๋“  ๋ฉ”์„œ๋“œ๊ฐ€ ์ถ”์ƒ ๋ฉ”์„œ๋“œ๋กœ๋งŒ ์ด๋ฃจ์–ด์ง„ ๊ตฌ์กฐ. ์—ฌ๋Ÿฌ ํด๋ž˜์Šค๋ฅผ ํ‘œ์ค€ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ
์ถ”์ƒํ™” ๊ณ„์ธต ํด๋ž˜์Šค ๋˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ์œ„ ๊ฐœ๋…์—์„œ ํ•˜์œ„ ๊ฐœ๋…์„ ์„ค๊ณ„ํ•˜๋Š” ๊ณ„์ธต ๊ตฌ์กฐ

๐Ÿ“Œ ์ถ”์ƒํ™” ๊ณ„์ธต ํ‘œํ˜„ ์˜ˆ์‹œ

  • ์ธํ„ฐํŽ˜์ด์Šค ์ƒ์†์„ ํ™œ์šฉํ•œ ์ถ”์ƒ ๊ณ„์ธต ํ‘œํ˜„ (interface)
    • ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ทœ์น™์„ ์ •์˜ํ•˜๊ณ  ์—ฌ๋Ÿฌ ํด๋ž˜์Šค๊ฐ€ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•จ
// 1๏ธโƒฃ ์ธํ„ฐํŽ˜์ด์Šค ์ •์˜ (์„ค๊ณ„)
interface Animal {
    void makeSound();  // โœ… ์ถ”์ƒ ๋ฉ”์„œ๋“œ interface ํ™œ์šฉ ๊ตฌํ˜„ ๊ฐ•์ œ
}

// 2๏ธโƒฃ ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„ (๊ฐ ํด๋ž˜์Šค๋งˆ๋‹ค ๋™๋ฌผ ๋‹ค๋ฅด๊ฒŒ ๊ตฌํ˜„)
class Dog implements Animal {
    @Override
    public void makeSound() {
        System.out.println("๋ฉ๋ฉ! ๐Ÿถ");
    }
}
class Cat implements Animal {
    @Override
    public void makeSound() {
        System.out.println("์•ผ์˜น! ๐Ÿฑ");
    }
}

// 3๏ธโƒฃ Main ํด๋ž˜์Šค (์‹คํ–‰ ํด๋ž˜์Šค)
public class Main {
    public static void main(String[] args) {
        Animal myDog = new Dog();  
        Animal myCat = new Cat();

        myDog.makeSound();
        myCat.makeSound(); 
    }
}
 โœ… ์ถœ๋ ฅ ๊ฐ’   
๋ฉ๋ฉ! ๐Ÿถ
์•ผ์˜น! ๐Ÿฑ

๐Ÿ“Œ ํด๋ž˜์Šค์ƒ์† ์ถ”์ƒ ๊ณ„์ธต ํ‘œํ˜„ ์˜ˆ์‹œ

  • ์ถ”์ƒ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ณตํ†ต ๊ธฐ๋Šฅ์„ ์ •์˜, ์ž์‹ ํด๋ž˜์Šค๊ฐ€ ๊ตฌ์ฒด์ ์ธ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋„๋ก!
// 1๏ธโƒฃ ์ถ”์ƒ ํด๋ž˜์Šค ์ •์˜ (์„ค๊ณ„)
  //๊ฐ ์ฐจ๋Ÿ‰๋งˆ๋‹ค ๋‹ค๋ฅด๊ฒŒ ๊ตฌํ˜„ํ•ด์•ผ ํ•  ์ถ”์ƒ ๋ฉ”์„œ๋“œ
abstract class Vehicle {
    abstract void move(); // โœ… ์ถ”์ƒ ๋ฉ”์„œ๋“œ (๊ตฌํ˜„ ๊ฐ•์ œ)

    void stop() {  // โœ… ๊ณตํ†ต ๊ธฐ๋Šฅ ์ œ๊ณต ๋ฉ”์„œ๋“œ
        System.out.println(" ์ฐจ๋Ÿ‰์ด ๋ฉˆ์ท„์Šต๋‹ˆ๋‹ค.");
    }
}

// 2๏ธโƒฃ ์ถ”์ƒ ํด๋ž˜์Šค ์ƒ์† (๊ฐ ์ฐจ๋Ÿ‰๋งˆ๋‹ค ๋‹ค๋ฅด๊ฒŒ ๊ตฌํ˜„)
class Car extends Vehicle {
    @Override
    void move() {
        System.out.println("๐Ÿš— ์ž๋™์ฐจ๊ฐ€ ๋„๋กœ๋ฅผ ๋‹ฌ๋ฆฝ๋‹ˆ๋‹ค.");
    }
}

class Airplane extends Vehicle {
    @Override
    void move() {
        System.out.println("โœˆ๏ธ ๋น„ํ–‰๊ธฐ๊ฐ€ ํ•˜๋Š˜์„ ๋‚ฉ๋‹ˆ๋‹ค.");
    }
}
// 3๏ธโƒฃ Main ํด๋ž˜์Šค (์‹คํ–‰ ํด๋ž˜์Šค)
public class Main {
    public static void main(String[] args) {
        Vehicle myCar = new Car();
        Vehicle myPlane = new Airplane();

        myCar.move(); // ์ถœ๋ ฅ: ๐Ÿš— ์ž๋™์ฐจ๊ฐ€ ๋„๋กœ๋ฅผ ๋‹ฌ๋ฆฝ๋‹ˆ๋‹ค.
        myPlane.move(); // ์ถœ๋ ฅ: โœˆ๏ธ ๋น„ํ–‰๊ธฐ๊ฐ€ ํ•˜๋Š˜์„ ๋‚ฉ๋‹ˆ๋‹ค.

        myCar.stop();  // ์ถœ๋ ฅ: ์ฐจ๋Ÿ‰์ด ๋ฉˆ์ท„์Šต๋‹ˆ๋‹ค.
    }
}
  
โœ… ์ถ”์ƒ ํด๋ž˜์Šค๋ฅผ ํ™œ์šฉํ•˜๋ฉด Vehicle์ด๋ผ๋Š” ๊ณตํ†ต ๊ธฐ๋Šฅ(stop)์€ ์œ ์ง€ํ•˜๋ฉด์„œ
โœ… move() ๋ฉ”์„œ๋“œ๋Š” ๊ฐ ํด๋ž˜์Šค์—์„œ ๋‹ค๋ฅด๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Œ์„ ์•Œ์ˆ˜์žˆ๋‹ค!
  = ์ฆ‰ ๊ณตํ†ต๊ธฐ๋Šฅ ๊ตฌํ˜„!

๐Ÿ’ก ์ถ”์ƒ ํด๋ž˜์Šค vs ์ธํ„ฐํŽ˜์ด์Šค ์ฐจ์ด์ 

  • ์ถ”์ƒํ™”๋Š” ๋ถˆํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ์ˆจ๊ธฐ๊ณ  ์ค‘์š”ํ•œ ์š”์†Œ๋งŒ ๋…ธ์ถœํ•˜๋Š” ๊ฒƒ
  • ์ธํ„ฐํŽ˜์ด์Šค๋Š” ํ‘œ์ค€์„ ์ •์˜ํ•˜๊ณ , ์—ฌ๋Ÿฌ ํด๋ž˜์Šค๊ฐ€ ๋™์ผํ•œ ๊ทœ์น™์„ ๋”ฐ๋ฅด๋„๋ก ๊ฐ•์ œ
  • ์ถ”์ƒ ํด๋ž˜์Šค๋Š” ๊ณตํ†ต ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋ฉด์„œ ์ผ๋ถ€ ๊ธฐ๋Šฅ์€ ์ž์‹ ํด๋ž˜์Šค์—์„œ ๊ตฌํ˜„ํ•˜๋„๋ก ๊ฐ•์ œ ํ• ์ˆ˜์žˆ์Œ
  • ์ƒํ™ฉ์— ๋”ฐ๋ผ ์ถ”์ƒ ํด๋ž˜์Šค์™€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ ์ ˆํžˆ ํ™œ์šฉํ•˜์—ฌ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๋†’์ด๊ธฐ
๋น„๊ต ํ•ญ๋ชฉ ์ถ”์ƒ ํด๋ž˜์Šค ์ธํ„ฐํŽ˜์ด์Šค
์„ ์–ธํ‚ค์›Œ๋“œ abstract class interface
๋ฉ”์„œ๋“œ ๊ตฌ์„ฑ ์ผ๋ฐ˜ ๋ฉ”์„œ๋“œ + ์ถ”์ƒ ๋ฉ”์„œ๋“œ ๊ฐ€๋Šฅ ๋ชจ๋“  ๋ฉ”์„œ๋“œ๊ฐ€ ์ถ”์ƒ ๋ฉ”์„œ๋“œ
๋ณ€์ˆ˜ ๊ตฌ์„ฑ ์ผ๋ฐ˜ ๋ณ€์ˆ˜ ์„ ์–ธ ๊ฐ€๋Šฅ ๋ชจ๋“  ๋ณ€์ˆ˜๋Š” public static final (์ƒ์ˆ˜)
์ƒ์† ๋ฐฉ์‹ extends ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด 1๊ฐœ๋งŒ ์ƒ์† ๊ฐ€๋Šฅ implements๋ฅผ ์‚ฌ์šฉํ•ด ๋‹ค์ค‘ ๊ตฌํ˜„ ๊ฐ€๋Šฅ
์‚ฌ์šฉ ๋ชฉ์  ๊ณตํ†ต ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋ฉด์„œ ์ผ๋ถ€ ๊ธฐ๋Šฅ์„ ๊ฐ•์ œ ํ‘œ์ค€(๊ทœ๊ฒฉ)์„ ์ •์˜ํ•˜์—ฌ ์—ฌ๋Ÿฌ ํด๋ž˜์Šค์—์„œ ๊ตฌํ˜„

๐Ÿ“” ๊ฐ์ฒด์˜ ๋‹คํ˜•์„ฑ

  • ํ•˜๋‚˜์˜ ํƒ€์ž…์œผ๋กœ ์—ฌ๋Ÿฌ ๊ฐ์ฒด๋ฅผ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋Š” ๊ธฐ์ˆ ์ž„
  • ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ํƒ€์ž… ์‚ฌ์šฉํ•˜์—ฌ ์ž์‹ ํด๋ž˜์Šค ๊ฐ์ฒด๋ฅผ ์ฒ˜๋ฆฌ
  // 1๏ธโƒฃ ์ธํ„ฐํŽ˜์ด์Šค ์ •์˜ (์„ค๊ณ„)
interface Animal {  โœ…  interface ํ™œ์šฉ ๊ตฌํ˜„ ๊ฐ•์ œ
    void makeSound();  // ๋™๋ฌผ๋งˆ๋‹ค ์†Œ๋ฆฌ๋ฅผ ๋ƒ„
    void exist();      // ๋™๋ฌผ์ด ์กด์žฌํ•œ๋‹ค
}
// 2๏ธโƒฃ ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„ (๊ฐ ํด๋ž˜์Šค๋งˆ๋‹ค ๋™๋ฌผ ๋‹ค๋ฅด๊ฒŒ ๊ตฌํ˜„)
  // Dog ํด๋ž˜์Šค
class Dog implements Animal {
    @Override
    public void makeSound() {
        System.out.println("๋ฉ๋ฉ!");
    }
    @Override
    public void exist() {
        System.out.println("๋‚˜๋Š” ๊ฐœ์ž…๋‹ˆ๋‹ค.");
    }
}
// Cat ํด๋ž˜์Šค
class Cat implements Animal {
    @Override
    public void makeSound() {
        System.out.println("์•ผ์˜น!");
    }
    @Override
    public void exist() {
        System.out.println("๋‚˜๋Š” ๊ณ ์–‘์ด์ž…๋‹ˆ๋‹ค.");
    }
}
  3๏ธโƒฃ Main ํด๋ž˜์Šค (์‹คํ–‰ ํด๋ž˜์Šค)
public class Main {
    public static void main(String[] args) {
        Animal animal = new Dog();  // โœ… ๊ฐ์ฒด ์ƒ์„ฑ!
        animal.makeSound(); 
        animal.exist();      

        animal = new Cat();  // โœ… ์žฌ ํ• ๋‹น 
        animal.makeSound();  
        animal.exist();    
  โœ… ์ถœ๋ ฅ ๊ฐ’ 
  ๋ฉ๋ฉ!
  ๋‚˜๋Š” ๊ฐœ์ž…๋‹ˆ๋‹ค.
  ์•ผ์˜น!
  ๋‚˜๋Š” ๊ณ ์–‘์ด์ž…๋‹ˆ๋‹ค.
  
  โœ”๏ธ Animal animal = new Dog();๋กœ Dog ๊ฐ์ฒด๋ฅผ ํ• ๋‹นํ•œ ํ›„ 
     animal = new Cat();๋กœ ์žฌํ• ๋‹นํ•œ๊ฑฐ์ž„ ๊ทธ๋ž˜์„œ ์†Œ๋ฌธ์ž์ž„

๐Ÿ“š ํ˜•๋ณ€ํ™˜(์—…/๋‹ค์šด)

๐Ÿ“˜ ์—… ์บ์ŠคํŒ… (์ž์‹ โ†’ ๋ถ€๋ชจ)

  • ์ž์‹ ํด๋ž˜์Šค ๊ฐ์ฒด๋ฅผ ๋ถ€๋ชจ ํด๋ž˜์Šค ํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ณผ์ •
  • ์ž์‹ ํด๋ž˜์Šค๋Š” ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ๋ชจ๋“  ์†์„ฑ๊ณผ ๋ฉ”์„œ๋“œ๋ฅผ ์ƒ์†๋ฐ›๊ธฐ ๋•Œ๋ฌธ์— ์ž์‹ ๊ฐ์ฒด๋ฅผ ๋ถ€๋ชจ ํƒ€์ž…์œผ๋กœ ์ž๋™์œผ๋กœ ๋ณ€ํ™˜ํ• ์ˆ˜์žˆ์Œ
    โญ๏ธ ์•ˆ์ „ํ•˜๊ณ  ๋ช…์‹œ์ ์ธ ์บ์ŠคํŒ… ์—†์ด ์ด๋ฃจ์–ด์ง

๐Ÿ“Œ ์—…์บ์ŠคํŒ… ์˜ˆ์‹œ

 1๏ธโƒฃ ์ธํ„ฐํŽ˜์ด์Šค ์ •์˜ (์„ค๊ณ„)
interface Animal {   โœ…  interface ํ™œ์šฉ ๊ตฌํ˜„ ๊ฐ•์ œ
    void makeSound();  // Animal ์ธํ„ฐํŽ˜์ด์Šค
}
  
2๏ธโƒฃ ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„
class Dog implements Animal {  
    @Override
    public void makeSound() {
        System.out.println("๋ฉ๋ฉ!");
    }
    public void fetch() {
        System.out.println("๊ณต์„ ๋ฌผ์–ด์˜ต๋‹ˆ๋‹ค.");
    }
}
3๏ธโƒฃ Main ํด๋ž˜์Šค (์‹คํ–‰ ํด๋ž˜์Šค)  
public class Main {
    public static void main(String[] args) {
        Dog dog = new Dog(); // โœ… ์ž๋™ ํ˜• ๋ณ€ํ™˜

        // 1. Dog ๊ฐ์ฒด๋ฅผ Animal ํƒ€์ž…์œผ๋กœ ์—…์บ์ŠคํŒ…
        Animal animal = dog;  
        animal.makeSound();  //  โœ… Animal ํƒ€์ž…์—์„œ ์ •์˜๋œ ๋ฉ”์„œ๋“œ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  
        // animal.fetch();  //  โŒ ์˜ค๋ฅ˜! Animal ํƒ€์ž…์—์„œ๋Š” fetch()๋ฅผ ์•Œ์ง€ ๋ชปํ•จ
    }
}

    }
}

๐Ÿ“™ ๋‹ค์šด ์บ์ŠคํŒ…(๋ถ€๋ชจ โ†’ ์ž์‹)

  • ๋ถ€๋ชจ ํด๋ž˜์Šค๋ฅผ ์ž์‹ ํด๋ž˜์Šค์˜ ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•˜๋ ค๋ฉด โญ๏ธ ๋ช…์‹œ์ ์ธ ์บ์ŠคํŒ…์ด ํ•„์š”ํ•จ
  • ์ž˜๋ชป๋œ ๋‹ค์šด ์บ์ŠคํŒ…์„ ์‹œ๋„ํ•˜๋ฉด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํƒ€์ž… ํ™•์ธ์ด ์ค‘์š”ํ•จ
  • ๋‹ค์šด์บ์ŠคํŒ…์—๋Š” instanceof๋Š” ์ธ์Šคํ„ด์Šค์ธ์ง€ ํ™•์ธํ•ด์ฃผ๋Š” ์—ญํ• ์„ํ•จ
  • if , else๋กœ ์œ ํ˜•์„ ํ™•์ธํ•˜์ž!
1๏ธโƒฃ ์ธํ„ฐํŽ˜์ด์Šค ์ •์˜ (์„ค๊ณ„)
  class Animal {
    void makeSound() {
        System.out.println("์†Œ๋ฆฌ");
    }
}
2๏ธโƒฃ ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„
// Dog ํด๋ž˜์Šค
class Dog extends Animal {
    @Override
    void makeSound() {
        System.out.println("๋ฉ๋ฉ!");
    }
    void wagTail() {
        System.out.println("๊ผฌ๋ฆฌ๋ฅผ ํ”๋“ ๋‹ค.");
    }
}
// Cat ํด๋ž˜์Šค
class Cat extends Animal {
    @Override
    void makeSound() {
        System.out.println("์•ผ์˜น!");
    }
    
    void scratch() {
        System.out.println("๊ธ๋Š”๋‹ค.");
    }
}
3๏ธโƒฃ Main ํด๋ž˜์Šค (์‹คํ–‰ ํด๋ž˜์Šค)  
public class Main {
    public static void main(String[] args) {
        // โœ… Animal ํƒ€์ž…์œผ๋กœ Dog ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ
        Animal animal = new Dog(); 
        
        // โœ… ๋งŒ์•ฝ ์ƒ์„ฑํ•œ๊ฒŒ Dog ๊ฐ์ฒด๋ผ๋ฉด wagTail()์„ ํ˜ธ์ถœ
        if (animal instanceof Dog) { 
            Dog dog = (Dog) animal;  // animal์„ Dog ํƒ€์ž…์œผ๋กœ ๋ฐ”๊ฟ”์คŒ
            dog.wagTail();  // "๊ผฌ๋ฆฌ๋ฅผ ํ”๋“ ๋‹ค." ์ถœ๋ ฅ
        } 
        // โœ… ๋งŒ์•ฝ animal์ด Cat ๊ฐ์ฒด๋ผ๋ฉด scratch()์„ ํ˜ธ์ถœ
        else if (animal instanceof Cat) { 
            Cat cat = (Cat) animal;  // animal์„ Cat ํƒ€์ž…์œผ๋กœ ๋ฐ”๊ฟ”์คŒ
            cat.scratch();  // "๊ธ๋Š”๋‹ค." ์ถœ๋ ฅ
        } 
        //โœ…  ๋งŒ์•ฝ Dog๋„ ์•„๋‹ˆ๊ณ  Cat๋„ ์•„๋‹ˆ๋ผ๋ฉด ์˜ˆ์ƒํ•˜์ง€ ๋ชปํ•œ ํƒ€์ž…์ผ ๊ฒฝ์šฐ ์ถœ๋ ฅ
        else {
            System.out.println("์•Œ ์ˆ˜ ์—†๋Š” ๋™๋ฌผ์ž…๋‹ˆ๋‹ค.");
        }
        
        // animal ๊ฐ์ฒด  ํ˜ธ์ถœ
        animal.makeSound(); 
    }
}
 โœ… ์ถœ๋ ฅ ๊ฐ’ 
๊ผฌ๋ฆฌ๋ฅผ ํ”๋“ ๋‹ค.
๋ฉ๋ฉ!
profile
์šฐ๋‹นํƒ•๊ฐœ๋ฐœ์ผ์ง€

1๊ฐœ์˜ ๋Œ“๊ธ€

comment-user-thumbnail
2025๋…„ 3์›” 7์ผ

๊ฐœ์›ƒ๊ธด ์ธ๋„ค์ผ๊ณผ ๊ณ ์ƒํ•œ ๋‚ด์šฉ์˜ ๊ธ€,, ์œ ์ตํ•ด์š” .แŸ.แŸ

๋‹ต๊ธ€ ๋‹ฌ๊ธฐ

๊ด€๋ จ ์ฑ„์šฉ ์ •๋ณด