๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ“ TIL

JAVA๋ฅผ ๋ฐฐ์šฐ๊ณ  ์‹ถ๋‹ค๋ฉด ์•Œ์•„์•ผ ํ•˜๋Š” ๊ฒƒ๋“ค 1

by Sjungwon 2025. 3. 6.
  1. ์ ‘๊ทผ ์ œ์–ด์ž (Access Modifiers)
  • private: ํ•ด๋‹น ํด๋ž˜์Šค ๋‚ด๋ถ€์—์„œ๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅ
  • default: ๊ฐ™์€ ํŒจํ‚ค์ง€ ๋‚ด์—์„œ๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅ /- ์–˜๋Š” ๋Œ€๋ถ€๋ถ„ ์š”์•ฝ ํ•  ์ˆ˜ ์žˆ์–ด์„œ default์“ฐ๋Š” ๋“ฏ/
  • protected: ๊ฐ™์€ ํŒจํ‚ค์ง€ ๋˜๋Š” ํ•˜์œ„ ํด๋ž˜์Šค์—์„œ ์ ‘๊ทผ ๊ฐ€๋Šฅ
  • public: ์–ด๋””์„œ๋‚˜ ์ ‘๊ทผ ๊ฐ€๋Šฅ

    private < default < protected < public
  1. ์ƒ์„ฑ์ž (Constructors)
    • ๊ธฐ๋ณธ ์ƒ์„ฑ์ž (No-Arg Constructor) - ์ดˆ๊ธฐํ™”, ํด๋ž˜์Šค๋ช…์ด๋ž‘ ๊ฐ™์•„์•ผํ•ด.
    • ๋งค๊ฐœ๋ณ€์ˆ˜ ์ƒ์„ฑ์ž (Parameterized Constructor) - ์ƒ์„ฑ์‚ฌ(์•ˆ์— ๋“ค์–ด์žˆ์Œ) ์ด๋Ÿฐ ํ˜•์‹์ด๋ž„๊นŒ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ฐ€์ง€๊ณ  ์žˆ์Œ 
    • ์ƒ์„ฑ์ž ์˜ค๋ฒ„๋กœ๋”ฉ - ๋งค๊ฒจ๋ณ€์ˆ˜ ๋„ฃ๊ฑฐ๋‚˜ ์•ˆ๋„ฃ๊ฑฐ๋‚˜ ์ƒ์„ฑ์ž ์ด๋ฆ„ ๋˜‘๊ฐ™์ด ์จ๋„ ๋จ. ๋‹จ ๊ตฌ๋ถ„ ๋จ.
  2. this ํ‚ค์›Œ๋“œ 
    • ๋ฉค๋ฒ„ ๋ณ€์ˆ˜์™€ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๊ตฌ๋ถ„ -  ๋Œ€์ฒด๋กœ this ํ‚ค์›Œ๋“œ๋Š” ์œ„์˜  int age ์ฒ˜๋Ÿผ ์œ„์˜ ๊ฐ’์œผ๋กœ ๊ฐ€๋Š” ๊ฒƒ ๊ฐ™์•„.
    •  NumberPair(int value) {
              this(value, value); // this()๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์œ„์˜ (int, int) ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœ (value๋ฅผ ๋‘ ๋ฒˆ ์ „๋‹ฌ)
          }
    • ๋‹ค๋ฅธ ์ƒ์„ฑ์ž ํ˜ธ์ถœ
  3. static ํ‚ค์›Œ๋“œ
    • static ๋ณ€์ˆ˜ (ํด๋ž˜์Šค ๋ณ€์ˆ˜) - static ๋ณ€์ˆ˜๋Š” ์ด์ œ ์–ด๋””์„œ๋‚˜ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋œ๋‹ค. public static int count = 0;
    • static ๋ฉ”์„œ๋“œ (ํด๋ž˜์Šค ๋ฉ”์„œ๋“œ) - ์›๋ž˜๋ฉด newํ•ด์„œ Calculator calc = new Calculator(); ์ด๋Ÿฐ  ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด์•ผํ•˜๋Š”๋ฐ ๊ทธ๊ฑธ ํ•˜๊ธฐ ๊ท€์ฐฎ์œผ๋ฉด  / ๊ทธ๋ฆฌ๊ณ  main์€ ์–ธ์ œ๋‚˜ static์ด ํฌํ•จ๋˜์–ด ์ด์จ
      public class MathUtil {
          public static int add(int a, int b) {
              return a + b;
          }
      }

      public class Main {
          public static void main(String[] args) {
              int result = MathUtil.add(5, 3); // ๊ฐ์ฒด ์ƒ์„ฑ ์—†์ด ํ˜ธ์ถœ
              System.out.println(result); // ์ถœ๋ ฅ: 8
          }
      }
  4. final ํ‚ค์›Œ๋“œ
    • final ๋ณ€์ˆ˜ - ํ•œ ๋ฒˆ ๊ฐ’์ด ์„ค์ •๋˜๋ฉด ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋‹ค. (์–ด๋””์„œ๋„ ์ˆ˜์ •๋˜๋ฉด ์•ˆ๋˜๋Š” ์• ๋ฅผ ์“ฐ๊ธฐ ์ข‹๋‹ค.)
    • final ๋ฉ”์„œ๋“œ์™€ ํด๋ž˜์Šค
  5. instanceof ์—ฐ์‚ฐ์ž  - instanceof ํ‚ค์›Œ๋“œ๋Š” "๊ฐ์ฒด์˜ ํƒ€์ž…์„ ๊ฒ€์‚ฌํ•  ๋•Œ" / ํŠธ๋ฃจ? ํŽ„์Šค? /
  6. private๊ณผ getter/setter์˜ ๊ฐœ๋… ์ •๋ฆฌ - ํ”„๋ผ์ด๋น—์˜ ๊ฒฝ์šฐ. ๋‹ค๋ฅธ ํด๋ž˜์Šค์—์„œ ์“ธ ์ˆ˜๋„ ์—†๋Š”๋ฐ getter์€๊ฐ’์„ ์ฝ์„๋•Œ setter๋Š” ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค. 
  7. static ํ‚ค์›Œ๋“œ์˜ ํ™œ์šฉ ๋ชฉ์  - 
  8. ์ƒ์„ฑ์ž์˜ ์ ‘๊ทผ ์ œ์–ด์ž(public/private)
  9. static ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ 
  10. ์ƒ์†(Inheritance) - ์ƒ์†์˜ ๊ฒฝ์šฐ ๋ถ€๋ชจ์˜ ๋ฉ”์„œ๋“œ๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. 
  11. ์˜ค๋ฒ„๋ผ์ด๋”ฉ(Overriding) - @Override๋ฅผ ์จ์•ผํ•ฉ๋‹ˆ๋‹ค. ๋ถ€๋ชจ์˜ ๊ฒƒ์„ ํŽธ์ง‘ํ•ด์„œ ์“ธ ์ˆ˜ ์žˆ๋‹ค.
  12. super ํ‚ค์›Œ๋“œ
    • super๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ถ€๋ชจ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœํ•˜๊ธฐ  - class Parent {
          public void sayHello() {
              System.out.println("Hello from Parent!");
          }
      }

      class Child extends Parent {
          @Override
          public void sayHello() {
              super.sayHello(); // ๋ถ€๋ชจ์˜ ๋ฉ”์„œ๋“œ๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ํ˜ธ์ถœ
              System.out.println("Hello from Child!");
          }
      }

      public class Main {
          public static void main(String[] args) {
              Child child = new Child();
              child.sayHello(); // ๋ถ€๋ชจ + ์ž์‹ ๋ฉ”์„œ๋“œ ๋ชจ๋‘ ์‹คํ–‰
          }
      }

      ์ด๋ ‡๊ฒŒ ๋ถ€๋ชจ์˜ ๋ฉ”์„œ๋“œ๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ํ˜ธ์ถœํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ super. ์€ ๋ถ€๋ชจ๋ฅผ ๋œปํ•ฉ๋‹ˆ๋‹ค.
    • super()๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ถ€๋ชจ ์ƒ์„ฑ์ž ํ˜ธ์ถœํ•˜๊ธฐ - - super(baseSalary);  // ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž ํ˜ธ์ถœ  / ๋งŒ์•ฝ ์ด๋ ‡๊ฒŒ ๋˜๋ฉด ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœํ•˜๊ฒŒ ๋œ๋‹ค.์ฆ‰ ์ดˆ๊ธฐํ™” ๊ฐ€๋Šฅ.
  13. ์ธํ„ฐํŽ˜์ด์Šค (Interface)
    • ์ธํ„ฐํŽ˜์ด์Šค์˜ ํŠน์ง•
      // ์ธํ„ฐํŽ˜์ด์Šค ์„ ์–ธ
      interface Animal {
          void makeSound(); // ์ถ”์ƒ ๋ฉ”์„œ๋“œ (๊ตฌํ˜„ ์—†์Œ)
      }

      // ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค
      class Dog implements Animal {  
          @Override
          public void makeSound() {
              System.out.println("๋ฉ๋ฉ!");
          }
      }

      // ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ๋˜ ๋‹ค๋ฅธ ํด๋ž˜์Šค
      class Cat implements Animal {
          @Override
          public void makeSound() {
              System.out.println("์•ผ์˜น!");
          }
      }

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

              myDog.makeSound();  // ์ถœ๋ ฅ: ๋ฉ๋ฉ!
              myCat.makeSound();  // ์ถœ๋ ฅ: ์•ผ์˜น!
          }
      }

      -/์œ„์˜ ๊ฒƒ์„๋ณด๋ฉด ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด ๋ญ”์ € ๋ƒ…๋”ฐ interface Animal ํ•˜๋ฉด์„œ ์„ ์–ธํ•˜๊ณ  ์•ˆ์— void makeSound() ๋ผ๊ณ  ์ถ”์ƒ ๋ฉ”์„œ๋“œ ๋ผ๊ณ  ์ ์–ด์„œ ์„ ์–ธ ๋ƒ…๋‹ค ๋จผ์ €ํ•ด๋†“๊ณ  ๋‚˜์ค‘์— ์ด๊ฑธ ํ˜ธ๋ผ์šฉํ•ด์„œ ํด๋ž˜์Šค ๊ตฌํ˜„ํ•˜๋ผ๋Š” ์†Œ๋ฆฌ/ ๋ฉ”์„œ๋“œ ์ด๋ฆ„ ์ผ์ผํžˆ ๋”ฐ๋กœ ์ง€์„ ํ•„์š”์—†๊ณ  ํŽธํ•จ.
    • ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋‹ค์ค‘ ๊ตฌํ˜„
      interface Movable {
          void move(int x, int y); // "์ด๋™" ๊ธฐ๋Šฅ ์•ฝ์†!
      }

      interface Resizable {
          void resize(double factor); // "ํฌ๊ธฐ ๋ณ€๊ฒฝ" ๊ธฐ๋Šฅ ์•ฝ์†!
      }

      ์ด๋ ‡๊ฒŒ ์—ฌ๋Ÿฌ๊ฐœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  14. ๋‹คํ˜•์„ฑ (Polymorphism)
    • ๋‹คํ˜•์„ฑ์˜ ํ•„์š”์„ฑ 
      interface Animal {
          void makeSound();
      }

      class Dog implements Animal {
          @Override
          public void makeSound() {
              System.out.println("๋ฉ๋ฉ!");
          }
      }

      class Cat implements Animal {
          @Override
          public void makeSound() {
              System.out.println("์•ผ์˜น!");
          }
      }

      public class Main {
          public static void main(String[] args) {
              Animal[] animals = { new Dog(), new Cat() };

              for (Animal a : animals) {
                  a.makeSound(); // ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ํ˜ธ์ถœ ๊ฐ€๋Šฅ
              }
          }
      }

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

      // ์ถ”์ƒ ํด๋ž˜์Šค (๋ถ€๋ชจ)
      abstract class Vehicle {
          // ๊ณตํ†ต์œผ๋กœ ์“ฐ์ด๋Š” ๊ธฐ๋Šฅ
          void stop() {
              System.out.println("์ฐจ๋Ÿ‰์ด ๋ฉˆ์ท„์–ด์š”.");
          }

          // ๊ฐ ์ฐจ๋Ÿ‰๋งˆ๋‹ค ๋‹ค๋ฅด๊ฒŒ ๊ตฌํ˜„ํ•ด์•ผ ํ•  ๊ธฐ๋Šฅ
          abstract void start();
      }

      // ์ž๋™์ฐจ ํด๋ž˜์Šค (์ž์‹)
      class Car extends Vehicle {
          void start() {
              System.out.println("์ž๋™์ฐจ๊ฐ€ ๋ถ€๋ฆ‰๋ถ€๋ฆ‰~");
          }
      }

      // ์˜คํ† ๋ฐ”์ด ํด๋ž˜์Šค (์ž์‹)
      class Motorcycle extends Vehicle {
          void start() {
              System.out.println("์˜คํ† ๋ฐ”์ด๊ฐ€ ๋ถ€์•„์•™~");
          }
      }

      public class Main {
          public static void main(String[] args) {
              Vehicle car = new Car();
              Vehicle motorcycle = new Motorcycle();

              car.start();      // ์ถœ๋ ฅ: ์ž๋™์ฐจ๊ฐ€ ๋ถ€๋ฆ‰~
              car.stop();       // ์ถœ๋ ฅ: ์ฐจ๋Ÿ‰์ด ๋ฉˆ์ท„์–ด์š”.

              motorcycle.start(); // ์ถœ๋ ฅ: ์˜คํ† ๋ฐ”์ด๊ฐ€ ๋ถ€์•„์•™~
              motorcycle.stop(); // ์ถœ๋ ฅ: ์ฐจ๋Ÿ‰์ด ๋ฉˆ์ท„์–ด์š”.
          }
      }

      -/ ์ด๊ฑธ ๋ณด๋ฉด ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด abstract ๋กœ ์“ฐ์ธ class๋Š” ๊ณตํ†ต์ด๋˜๊ณ  abstract๋กœ ์“ฐ์ธ ๋ณ€์ˆ˜๋„ ๊ฐ ์ฐจ๋Ÿ‰๋งˆ๋‹ค ๋‹ค๋ฅด๊ฒŒ ์“ฐ์ผ ์ˆ˜ ์žˆ๊ฒŒ ๋˜์–ด ์žˆ๋‹ค. ์ถ”์ƒํด๋ž˜์Šค!

  16. ์ธํ„ฐํŽ˜์ด์Šค์™€ ์ถ”์ƒ ํด๋ž˜์Šค ๋น„๊ต
  17. ๋””์ž์ธ ํŒจํ„ด (Design Pattern)
    • ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด (Singleton Pattern)

      - ์–ธ๋‹ˆ๊ฐ€ ๋งํ•˜๊ธธ... ๊ฐœ๋ฐœ์ž๋“ค์˜ ๋ˆˆ๋ฌผ๋กœ ๋งŒ๋“ค์–ด์ง„ ๊ธฐ์ค€, ํ‘œ์ค€, ์ด๋ผ๊ณ  ๋ณด๋ฉด ๋œ๋‹ค. (์ด๋ ‡๊ฒŒ ํ•˜์‹œ์˜ค..)
  18. ์ œ๋„ค๋ฆญ (Generics)
    • ์ œ๋„ค๋ฆญ ํด๋ž˜์Šค (Generic Class)
    • ์ œ๋„ค๋ฆญ ๋ฉ”์„œ๋“œ (Generic Method)
    • ์ œํ•œ๋œ ํƒ€์ž… (Bounded Type Parameters)
    • ์™€์ผ๋“œ์นด๋“œ (Wildcard)
    • ์ œ๋„ค๋ฆญ์˜ ์žฅ์ 
      • ํƒ€์ž… ์•ˆ์ „์„ฑ(Type Safety) ๋ณด์žฅ
      • ์ฝ”๋“œ ์žฌ์‚ฌ์šฉ์„ฑ ์ฆ๊ฐ€
      • ํ˜• ๋ณ€ํ™˜ ํ•„์š” ์—†์Œ (๋ถˆํ•„์š”ํ•œ ์บ์ŠคํŒ… ์ œ๊ฑฐ)

List<String> stringBox = new ArrayList<>(); // ๋ฌธ์ž์—ด๋งŒ ๋‹ด๋Š” ์ƒ์ž
์ด๊ฑฐ๋Š” ๋ฌธ์ž์—ด๋งŒ ๋“ค์–ด๊ฐ€์ง€ ์ˆซ์ž๋Š” ๋ชป๋“ค์–ด๊ฐ„๋‹ค.
<T> ๋ผ๊ณ  ํ•˜๋ฉด ๋‚˜์ค‘์— ํƒ€์ด ์ •ํ•ด๋„ ๋จ. <T extends Number> ๋Š” ์ˆซ์ž์— ๋งŒ ๊ฐ€๋Šฅํ•œ ์ œํ•œ๋œ ํƒ€์ž… ๋งํ•จ

class Util {
    // <T>๋Š” ๋‚˜์ค‘์— ๊ฒฐ์ •ํ•  ํƒ€์ž…!
    public static <T> void print(T value) {
        System.out.println(value);
    }
}

public class Main {
    public static void main(String[] args) {
        Util.print(10);          // ์ˆซ์ž ์ถœ๋ ฅ
        Util.print("์•ˆ๋…•!");     // ๋ฌธ์ž์—ด ์ถœ๋ ฅ
        Util.print(3.14);        // ์‹ค์ˆ˜ ์ถœ๋ ฅ
    }
}

 

 Java์˜ ํด๋ž˜์Šค์™€ ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ(OOP) ๊ฐœ๋…์„ ์ „๋ฐ˜์ ์œผ๋กœ ์ž˜ ๋‹ค๋ฃจ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.