멋사 Backend 16일차 🦁

신재원·2023년 5월 9일

🐷 Java

💪 생성자 (Constructor) 란 ?

  • 생성자란 간단히 말해 클래스 (Class)와 이름이 같은 메소드 입니다.
public class User {
    private String name;
    private int age;

    // 생성자
    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // 생성자
    public User(int age) {
        this.age = age;
    }
	
    // 출력 메소드
    public void print() {
        System.out.println("이름은 : " + name + " " + "나이는 :" + age);
    }

    public static void main(String[] args) {
        User user1 = new User("신재원", 25);
        user1.print();

        User user2 = new User(30);
        user2.print();
    }
}

출력
이름은 : 신재원 나이는 :25
이름은 : null 나이는 :30

📌 클래스에서 멤버변수를 private로 하는 이유는 ?

private String name; : 멤버 변수로 private 으로 선언하면, 외부에서는 직접적으로 접근이 불가능하므로, 클래스 내부에서만 사용할 수 있습니다.

  • 즉 이 말은 접근을 gettersetter 를 통해 제어함으로써 캡슐화에 부합한다는 것입니다.

🥨 생성자 오버로딩

	// 생성자
    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // 생성자
    public User(int age) {
    	this.name = "";
        this.age = age;
    }
  • User 클래스에서 다양한 형태의 생성자를 선언하여 오버로딩 하였습니다.
  • 이를 통해 User 클래스의 객체를 생성할때 이름과 나이를 함께 입력할 수도 있고, 나이만 입력해서 사용할수있습니다.
    ( 파라미터를 달리하여 적용되는것이 다르다 )

❗ 클래스에 생성자가 하나도 없는경우에는 컴파일러가 자동으로 기본 생성자를 생성
( 생성자가 하나라도 있으면, 자동으로 생성 XX )

여기서 this. 란?

	// 생성자
    public User(String name, int age) {
        this.name = name;
        age = age;
    }
    // 생성자
    public User(String name, int userAge) {
        this.name = name;
        age = userAge;
    }
  • 위 코드에서 멤버 변수의 age 인지, 파라미터의 age인지 값의 세팅이 구분되 지않습니다.
  • this 는 클래스를 가르킵니다. (멤버 변수)

📍 파라미터 이름과 멤버 변수의 이름을 같지 않게 사용할수도있습니다.
(하지만 대체로 생성자에서 파라미터랑 멤버변수의 이름을 같게 사용합니다)

  • 결론은 this 를 써서 접근하는걸 권장합니다.

🤓 생성자는 왜 쓰나요 ?

  • 생성자를 사용 하지않고 코드를 작성하려면 별도의 이름과 나이을 할당해야되는 메소드를 작성해줘야 합니다.
    ( 예시 코드를 보여 드리겠습니다 )
public void initData(String name, int age){
        this.name = name;
        this.age = age;
    }
    
    public static void main(String[] args) {
        User user = new User();
        user.initData("신재원", 25); // 필드 초기화
    }
  • 위 코드에서 initData의 필드를 초기화 하기 위해서는 생성자와 다르게 한번을 호출하여 값을 할당 해줘야 합니다.
    ❗❗ 생성자를 사용하면은 메소드를 정의하지않고, 초기화를 할수있습니다.

🌳 스태틱 메소드

스태틱 ( Static ) 메소드 ( Method )는 일반 메소드와 달리 객체의 생성없이 호출하여 사용 할수 있다는 것입니다.

public class Main {
    public static void printHello() {
        System.out.println("Hello!");
    }

    public static void main(String[] args) {
        printHello(); // 객체 생성없이 접근 가능
    }
}
  • 스태틱 메소드도 스태틱 변수와 같이 남용하면 안됩니다.
    🍘 Spring에서 Util 클래스로 많이 사용

자바에서 지원하는 Math.min(), Math.max() 같이 지원하는 스태틱 메소드도 있습니다.

🍔 추상 클래스

  • 하나 이상의 추상 ( abstract ) 메소드를 가지고 있는 클래스를 말합니다.
    • 추상 메소드란 구현되지 않은 메소드를 말하는 것이며, 객체를 직접 생성할수 없습니다.
public abstract class Unit {
    public abstract void attack();

    public class Marine extends Unit {
        @Override
        public void attack() {
            System.out.println("소총으로 공격합니다.");
        }
    }
    public class Firebat extends Unit {
        @Override
        public void attack() {
            System.out.println("화염방사기로 공격합니다.");
        }
    }
    
    public static void main(String[] args) {
        Marine marine = new Marine();
        marine.attack();
    }
}
  • Marine 이라는 클래스는 Unit 클래스를 상속하여 attack 이라는 메소드를
    오버라이딩 ( 재정의 ) 하여 구현하였습니다.
    ✔ 무조건 구현체를 만들어 줘야 합니다.

🍪 번외

📍 메소드 분리

  • 기능별로 메소드를 분리해야 좋습니다
    ( 재사용성, 가독성, 줄 단위로 디버깅 가능 )

메소드 분리, 생성자를 추가하는 시점

  1. 설계를 잘하면 좋지만, 설계를 완벽하게 하는것은 불가능에 가깝습니다.
  2. 요구사항이 나오면 그때 리팩토링을 수행합니다.
    (중복되는 코드를 분리)

자바의 OOP로 나아가는 과정

  • 핵심 로직을 일단 작성합니다.
  • 메소드 (기능)을 분리합니다.

🍤 추상 클래스와 인터페이스

실무에서는 추상 클래스와 상속을 생각보다 잘 쓰기가 힘듭니다.
(extends, super 등)
상속은 잘 안쓰는 반면, 인터페이스는 많이 사용합니다.

✔ 제어의 역전

0개의 댓글