swift에는 사용자가 코드를 구현할 때
편리하게 데이터와 메소드 같은 것들을 관리하기 위하여 그것들을 묶어서 관리하도록 하는 기능이 있습니다.
(마치 최첨단 쿠키틀 같은 기능?)
아주 중요한 개념이죠
(다른 언어에서도 쓰이기 때문에 알아두면 좋습니다)
이번에는 그 둘의 개념을 알아보면서 차이점과 공통점을 알아보려고 합니다!
struct Person {
var name : String;
init(s : String) {
name = s;
}
func nameIs() {
print("나는", name, "이다.");
}
}
var person1 = Person(s : "yuun");
person1.nameIs();// 나는 yuun 이다.
_______________________________________
struct Person {
var name : String;
func nameIs() {
print("나는", name, "이다.");
}
}
var person1 = Person(name : "yuun");
person1.nameIs(); // 나는 yuun 이다.
변수 선언을 할 때 초기값을 지정해주는 init을 사용하여 변수의 값을 넣어줄 수 있지만 구조체(struct)와 같은 경우는 init을 사용하지 않아도 초기값을 설정해 줄 수 있습니다.
struct Person {
var name : String;
init(s : String) {
name = s;
}
func nameIs() {
print("나는", name, "이다.");
}
}
var human1 = Person(s : "yuuun");
var human2 = human1;
var human3 = human1;
human2.name = "kiiiim";
human3.name = "Leeee";
human1.name;//나는 yuuun 이다.
human2.name;//나는 kiiiim 이다.
human3.name;//나는 Leeee 이다.
이처럼 struct는 값을 복사하는 변수를 만들면(위에서는 human2,3과 같은 변수)
복사를 한 변수에서 값을 변경되어도 원본의 변수의 값에 영향을 주지 않는 것을 볼 수 있습니다.
이와 같은 특징은 선언될 때 마다 새로운 메모리에 할당이 되어서 원본의 값에 영향을 주지 않는 것입니다.
class Person {
var name : String;
init(s : String) {
name = s;
}
func nameIs() {
print("나는", name, "이다.");
}
}
var human1 = Person(s : "yuuun");
human1.nameIs();//나는 yuuun 이다.
class와 같은 경우는 초기화 할 경우 무조건 init을 넣어야 합니다.
아니면 에러가 발생합니다.
class Person {
var name : String = "rrrr";
init(s : String) {
name = s;
}
func nameIs() {
print("나는", name, "이다.");
}
}
var human1 = Person(s : "yuuun");
var human2 = human1;
var human3 = human1;
human2.name = "kiiiim";
human3.name = "Leeee";
human1.nameIs();//나는 Leeee 이다.
human2.nameIs();//나는 Leeee 이다.
human3.nameIs();//나는 Leeee 이다.
class는 복사하여 변수를 선언할 때마다 본래의 것을 참조하는 것이기에 여러개의 변수가 선언이 되어도 본래의 것은 하나라고 생각하시면 됩니다.(나루토의 그림자 분신술 같은 느낌...?)
그렇기에 위에서 human2와3 변수에서 값이 변경이되면 원본의 값이 변경이 되기 때문에 .nameIs()를 호출했을 때 마지막으로 할당된 변수의 값이 출력이 된 것 입니다.
class Home {
var home : String = "집이 최공";
func myHome() {
print("!!!!! @ - @ !!!!!");
}
}
class Person:Home {
var name : String;
init(s : String) {
name = s;
}
func nameIs() {
print("나는", name , "이다. 나는", home);
myHome();
}
}
var human1 = Person(s : "yuuun");
human1.nameIs();
//나는 yuuun 이다. 나는 집이 최공
//!!!!! @ - @ !!!!!
class와 struct의 차이점 중에 가장 큰 차이인 상속입니다. 이는 struct는 할 수 없는 기능입니다.
위와 같이 서로 다른 class를 선언하였지만
Home class를 물려 받은 Person class가 부모의 클래스의 메소드와 변수를 불러와 사용할 수 있습니다.
class 상속에 관해서는 여러가지 기능들이 더 있지만 이번에는 여기까지 다음에 따로 설명을 추가 할 예정입니다.
class Person {
var name : String;
init(s : String) {
name = s;
}
deinit {
print("잘자요@@", name ,"은 자러 갑니다!")
}
func nameIs() {
print("나는", name, "이다.");
}
}
var human1:Person? = Person(s: "yuuun");
human1 = nil;
소멸자 deinit은 선언된 클래스 인스턴스가 메모리에서 삭제가 될 때 자동으로 실행이 되는 메소드 입니다.
struct에서는 사용되지 않습니다.
class Person {
var name : String = "rrrr";
init(s : String) {
name = s;
}
func nameIs() {
print("나는", name, "이다.");
}
}
struct Person {
var name : String = "rrrr";
init(s : String) {
name = s;
}
func nameIs() {
print("나는", name, "이다.");
}
}
위와 같이 사용하는 사람은 없겠지만 선언은 가능.
오늘은 여기까지
(공부 할 때 참고한 사이트)