프로그래밍Rust 개발자

러스트에서 구조체의 생성자와 연관된 함수는 어떻게 작동하며, new와 with_capacity의 차이는 무엇인가? 이를 올바르게 구현하는 방법은 무엇인가?

Hintsage AI 어시스턴트로 면접 통과

답변.

질문의 배경

러스트에는 OOP 언어와 같은 전통적인 생성자가 없지만, 구조체의 명시적인 초기화를 구현하는 생성자 패턴을 재현하는 연관 함수(대개 new라고 함)가 있습니다. 연관 함수는 미리 설정된 값으로 구조체의 인스턴스를 생성하거나 추가 논리를 제공하면서 생성할 수 있게 해줍니다(예: 메모리 예약).

문제

많은 사람들이 New만 사용하고, 다른 팩토리 메서드 패턴(예: with_capacity)을 잊거나, 구조체의 초기화를 잘못 구현하는 경우가 많습니다(특히 비공개/공개 필드로 인해), 이는 불변성 오류를 초래할 수 있습니다.

해결책

연관 함수 유형 newimpl을 통해 구현되고, 불변성이 있는 객체 생성을 위한 유일한 진입점이 될 수 있습니다. with_capacity와 같은 기능은 메모리를 미리 할당하는 옵션을 제공합니다.

코드 예시:

pub struct MyBuffer { data: Vec<u8>, } impl MyBuffer { pub fn new() -> Self { MyBuffer { data: Vec::new() } } pub fn with_capacity(cap: usize) -> Self { MyBuffer { data: Vec::with_capacity(cap) } } }

주요 특징:

  • 연관 함수는 self를 받지 않으며, 정적 메서드처럼 작동함
  • 공개 팩토리 메서드는 불변성을 설정하는 데 도움을 줌
  • 다양한 시나리오에 맞는 다양한 "생성자"를 구현할 수 있음

함정 질문.

new를 구현하지 않으면 Rust가 기본적으로 생성한다?

아니요. new는 자동으로 생성되지 않습니다. 메서드가 명시적으로 구현되지 않으면, 공개 필드만 있더라도 존재하지 않습니다.

new와 Default의 근본적인 차이는 무엇인가?

Default는 타입이 Default를 구현하거나 명시적으로 상속받은 경우에만 호출할 수 있는 트레이트 생성자입니다. 일반적인 알고리즘에 표준으로 사용되지만, 항상 new와 일치하지는 않습니다.

비공개 구조체에 대해 new와 with_capacity 메서드를 사용할 수 있는가?

네, 메서드를 공개 또는 비공개로 만들 수 있지만, 비공식 구조체에 대한 공개 생성자를 만드는 것은 사용자가 모듈 외부에서 해당 구조체의 인스턴스를 생성할 수 없게 합니다.

일반적인 실수 및 안티 패턴

  • 구조체의 모든 필드를 공개로 설정하여 생성자 외부에서 유효하지 않은 값을 생성할 수 있게 함
  • 메모리 할당 절약이 중요한 컬렉션에 대해 with_capacity를 구현하지 않음
  • 모든 필드를 정확하게 초기화하지 않는 new를 구현함

실생활 사례

부정적인 사례

불변성이 없는 공개 구조체:

pub struct User { pub login: String, pub active: bool }

장점:

  • 객체 생성이 쉬움

단점:

  • 유효하지 않은 값 생성 가능(예: 빈 로그인, 초기화되지 않은 필드)

긍정적인 사례

필드는 비공개, new를 통한 객체 생성만 가능, 불변성 보장:

pub struct User { login: String, active: bool } impl User { pub fn new(login: String) -> User { User { login, active: true } } }

장점:

  • 잘못된 데이터로부터 보호됨
  • 초기화 검증 및 논리를 제어할 수 있음

단점:

  • 추가 메서드를 작성해야 함 - 코드량 증가