강좌11-구조체의 확장: Implement

1 분 소요

구조체에 implement를 적용하면 함수를 추가할 수 있습니다.
이는 마치 Class 구조와 비슷하게 동작하는 효과를 주므로 매우 유용하게 사용할 수 있습니다.

struct User {
  first: String,
  last: String,
  age: u32
}

impl User {
  fn full_name (&self) -> String {
    format!("{} {}", self.first, self.last)
  }
}

사용 방법은 반드시 구조체가 구성되어 있어야 하며,
함수마다 첫번째 인자로 &self를 반드시 가져야 합니다.

활용

impl은 여러개의 함수를 포함할 수 있으나,
여러번 나누어 선언해도 됩니다.

impl User {
  fn full_name (&self) -> String {
    format!("{} {}", self.first, self.last)
  }
  fn all(&self) -> String {
    format!("{} {} {}", self.first, self.last, self.age)
  }
}

// 또는
impl User {
  fn full_name (&self) -> String {
    format!("{} {}", self.first, self.last)
  }
}

impl User {
  fn all(&self) -> String {
    format!("{} {} {}", self.first, self.last, self.age)
  }
}

중복 불가

당연할 수 있겠으나 어느 상황에도 같은 함수를 중복해서 사용할 수는 없습니다.

impl User {
  fn full_name (&self) -> String {
    format!("{} {}", self.first, self.last)
  }
}

impl User {
  fn full_name (&self) -> String {
    format!("{} {}", self.last, self.first)
  }
}

//결과
   |
8  | /   fn full_name (&self) -> String {
9  | |     format!("{} {}", self.first, self.last)
10 | |   }
   | |___^ duplicate definitions for `full_name`
...
14 | /   fn full_name (&self, n: i32) -> String {
15 | |     format!("{} {}", self.last, self.first)
16 | |   }
   | |___- other definition for `full_name`

함수명의 중복을 체크하기 때문에 파라미터의 확장 역시 불가합니다.

impl User {
  fn full_name (&self) -> String {
    format!("{} {}", self.first, self.last)
  }
}

impl User {
  fn full_name (&self, n: i32) -> String {
    format!("{} {}", self.last, self.first)
  }
}

//결과
   |
8  | /   fn full_name (&self) -> String {
9  | |     format!("{} {}", self.first, self.last)
10 | |   }
   | |___^ duplicate definitions for `full_name`
...
14 | /   fn full_name (&self, n: i32) -> String {
15 | |     format!("{} {}", self.last, self.first)
16 | |   }
   | |___- other definition for `full_name`

추가 인자

&self 외의 인자를 받을 수 있습니다.
추가 인자가 있는 함수에 값을 전달하려면 일반 함수를 호출하듯 호출하면 됩니다.
즉, &self를 무시하면 일반 함수를 호출하는 것과 동일합니다.

impl User {
  fn is_older (&self, age:u32) -> String {
    self.age > age
  }
}

fn main() {
  println!("{}", is_older(20))
}

댓글남기기