본문으로 바로가기

java 파라미터 바인딩이란

category Programing/JAVA 2023. 7. 28. 17:21
반응형

"파라미터 바인딩"은 일반적으로 함수 또는 메소드에 전달된 실제 값이 매개변수와 어떻게 연결되는지를 설명하는 프로그래밍 용어입니다. 자바와 같은 언어에서는 일반적으로 "정적 바인딩" 또는 "동적 바인딩"을 사용해 이를 처리합니다.

정적 바인딩: 이것은 컴파일 시점에 컴파일러에 의해 메소드 호출을 정확한 메소드와 연결하는 과정입니다. 오버로딩된 메소드의 경우를 예로 들면, 컴파일러는 메소드의 매개변수의 타입을 기반으로 해당 메소드를 결정하게 됩니다. 이것은 컴파일 시점에 발생하므로 "정적"이라고 합니다.

동적 바인딩: 이것은 런타임 시점에 발생하며, 오버라이딩된 메소드에 대해 실제 객체의 타입을 기반으로 어떤 메소드가 호출될 것인지를 결정합니다. 즉, 참조 변수가 가리키는 실제 객체에 따라 결정됩니다. 이것은 런타임에 결정되므로 "동적"이라고 합니다.

예를 들어, SQL 쿼리에서의 파라미터 바인딩은 쿼리 실행 시 실제 값을 파라미터에 연결하는 과정을 의미합니다. 이 방법은 보안(예: SQL 인젝션 방지)과 편리성 측면에서 유용하게 사용됩니다.

Java에서 PreparedStatement 인터페이스를 사용하면 SQL 쿼리에서 파라미터 바인딩을 할 수 있습니다. PreparedStatement를 사용하면 런타임에 SQL 쿼리에 파라미터를 안전하게 바인딩할 수 있습니다.

String query = "SELECT * FROM users WHERE age = ?";
PreparedStatement stmt = connection.prepareStatement(query);
stmt.setInt(1, 30);
ResultSet rs = stmt.executeQuery();

========생성자에 파라미터 바인딩 하는 이유는?

==> 자바에서 생성자에 파라미터를 바인딩하는 이유는 주로 객체의 초기 상태를 설정하기 위함입니다. 생성자는 객체가 생성될 때 호출되며, 매개변수를 통해 제공된 값들로 객체의 필드를 초기화할 수 있습니다.

파라미터 바인딩을 사용하면 객체를 생성하는 동안 다양한 방식으로 객체를 구성할 수 있습니다. 예를 들어, 사람 객체를 생성할 때 이름과 나이를 파라미터로 받는 생성자를 만들 수 있습니다.

public class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

위의 코드에서는 Person 객체를 생성할 때 이름과 나이를 파라미터로 제공하여 객체를 초기화할 수 있습니다. 이렇게 생성자에 파라미터를 바인딩함으로써, 객체의 필드를 원하는 값으로 설정할 수 있습니다.

이 외에도, 생성자에 파라미터를 바인딩하는 것은 다음과 같은 이유로 유용합니다:

객체의 불변성 유지: 필드가 final로 선언되어 있다면 생성자에서 초기화해야 하며, 이후에는 변경할 수 없습니다. 이를 통해 객체의 불변성을 유지할 수 있습니다.

의존성 주입: 객체 지향 프로그래밍 및 프레임워크(예: Spring)에서 의존성 주입을 사용하여 객체를 생성하고 관리하는 경우, 생성자를 통해 필요한 의존성을 주입받을 수 있습니다.

유효성 검사: 생성자에 파라미터를 바인딩하면, 그 파라미터에 대한 유효성 검사를 수행할 수 있습니다. 유효하지 않은 값이 전달될 경우, 즉시 예외를 발생시켜 객체 생성을 방지하고 버그를 미리 차단할 수 있습니다.

=====아, 그럼 생성자와 getter, setter가 같은역할을 하는가?

==>생성자와 getter/setter는 서로 다른 역할을 합니다.

**생성자(Constructor)**는 객체가 생성될 때 호출되는 특별한 메소드로, 주로 객체의 초기 상태를 설정하는 데 사용됩니다. 생성자는 객체의 필드를 초기화하고 필요한 설정을 수행합니다. 이는 객체가 생성될 때 한 번만 발생합니다.

예를 들어, 아래의 Person 클래스에서 생성자는 name과 age 필드를 초기화합니다:

public class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

Getter/Setter 메소드는 각각 객체의 필드 값을 검색하거나 변경하는 데 사용됩니다. Getter는 필드의 값을 반환하고, Setter는 필드의 값을 변경합니다. 이 메소드들은 객체의 생명 주기 동안 여러 번 호출될 수 있습니다.

예를 들어, 아래의 Person 클래스에서 getName()은 name 필드의 값을 반환하고, setName(String name)은 name 필드의 값을 설정합니다:

public class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
    
    public int getAge() {
        return age;
    }

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

따라서, 생성자와 getter/setter는 서로 다른 역할을 수행합니다. 생성자는 객체가 생성될 때 필드를 초기화하고, getter/setter는 필드의 값을 검색하거나 변경하는 데 사용됩니다. 이 두 가지 방법을 조합하여 객체의 상태를 제어하고 관리할 수 있습니다.

=====그럼 생성자가 없으면 어떻게 초기화?

자바에서는 생성자를 명시적으로 정의하지 않으면 컴파일러가 기본 생성자를 자동으로 제공합니다. 이 기본 생성자는 매개변수가 없고, 클래스의 필드를 기본값으로 초기화합니다. 기본값은 데이터 타입에 따라 달라집니다. 예를 들어, 숫자형 필드의 기본값은 0이고, 참조형 필드의 기본값은 null입니다.

예를 들어, 아래와 같은 클래스를 가지고 있다고 가정해 보겠습니다:

public class Person {
    private String name;
    private int age;
}

이 클래스에는 생성자를 명시적으로 정의하지 않았으므로, 컴파일러는 기본 생성자를 자동으로 제공합니다. 따라서 다음과 같은 방식으로 Person 객체를 생성할 수 있습니다:

Person person = new Person();

이 때, name 필드는 null로, age 필드는 0으로 초기화됩니다. 그러나 이런 방식으로 생성된 객체는 특별히 유의미한 상태를 가지고 있지 않습니다. 이 경우, 필드를 원하는 값으로 설정하기 위해 setter 메소드를 사용해야 합니다:

person.setName("Alice");
person.setAge(25);

이렇게 하면 person 객체의 name 필드는 "Alice"로, age 필드는 25로 설정됩니다.

하지만, 대부분의 경우 생성자를 이용해서 객체의 초기 상태를 정의하면 좀 더 명확하고 안전한 코드를 작성할 수 있습니다. 특히, 객체의 불변성을 유지하려는 경우에는 생성자를 이용해서 필드를 한 번에 초기화하고, setter 메소드는 제공하지 않는 방식을 선택하곤 합니다.

 

반응형