인스턴스 상수로 선언하게되면 주소값이 변하지 않는다는 의미이고 내부의 property의 값은 변경이 가능함
클래스와 구조체 사용법
기본적으로 사용할 때 생성할 때 앞부분에 class / struct 붙이고 대문자로 명명하는것 빼곤 동일하다 (하지만 차이가 있긴하기 때문에 추후에 알아 볼것이다)
클래스만들기
데이터 = 전역 변수 및 타입속성이 저장
클래스의 변수와 함수는 속성 메서드라고 불린다데이터 = 전역 변수 및 타입속성이 저장
객체 생성하기
클래스를 인스턴스(객체)화 하면 참조타입이라 힙에 저장이 된다
변수에 저장하므로 변수는 스택에 저장되지만 세부 내용(Restaurant / name / bestmenu / bell / goOut)은 힙에 저장된다
세부내용을 자세히 보면 클래스 주소나 메모리 관리RC나 property의 저장된 타입에 대한 내용이 담겨있다
소괄호를 열고 닫는 행위 자체가 인스턴스 생성이라는 것을 인지해야한다
구조체 경우 인스턴스하면 값타입 이므로 스택에 저장이 된다
변수에 저장하므로 변수는 스택에 저장되고 세부 내용(Restaurant / name / bestmenu / bell / goOut)도 스택에 저장된다
객체 생성의 속성 접근하기
구조체 속성을 값 변경 한다면?? 각각 다른 데이터이기 때문에 다르게 값이 나온다
a
a2
레스토랑 -> 치킨
레스토랑
구초제가 클래스보다 더 가볍다
클래스와 구조체에서 let을 정의한다면?
클래스
주소값이 변경하지 않는 의미(속성은 변경이 가능하다)
구조체
값이 변경되지 않는다는 의미(속성을 바꿀 수 없음)
초기화(init) == 생성자 메서드
클래스와 구조체는 모든 저장 속성을 초기화 해야한다 생성자 실행 종료시점에는 모든 속성의 초기값이 저장되어 있어야하는 이유는 초기화 하지 않으면 컴파일단계에서 에러가 나기 때문이다 인스턴스화(restaurant1) 할 때 반드시 생성자(초기화) 저장속성을 초기화 해야한다 하지 않을 시 오류남
만약 속성이 Optional이라면?
초기부터 기본값을 명시적으로 세팅도 가능하지만 보통 잘 하지 않을것 같음
Identity Operators(식별 연산자) : 두개의 참조가 같은 인스턴스를 가리키고 있는지를 비교하는 방법
객체 지향 프로그래밍
언제 클래스와 구조체를 사용해야할까?
데이터의 관점 : 여러개의 데이터를 묶어서 사용할 때
구조체 : 메모리에 오랫동안 저장하지 않고 상속 없이 가볍게 사용할 때 (많이 사용함) - 애플에서 권장
클래스 : 오랫동안 메모리에 저장하며 관리해야하고 상속을 해야하는 경우
구조체 사용할 때
연관된 데이터를 단순히 캡슐화 하는 목적
캡슐화한 데이터를 참조보다 값을 복사해서 사용할 때
구조체에 저장된 저장 속성이 값타입이고 참조보다 복사를 사용할 때
클래스 사용할 때
데이터에서 상속의 구조가 필요
해당 모델을 serialize 하여 전송하거나 파일로 저장할 때
객체 지향 OOP 4대 특징(Object- Oriented Programming)
1. 추상화(abstraction) : 모델링 -공통적인 특성을 가지고 하나(class)로 만드는것 -공통적인 특성을 가지고 클래스로 정의하는 자체가 추상화의 개념이다 -예를 들어 가게에서 공통적으로 가질 수 있는 속성 => 가게 이름 / 메뉴 / 위치 등..
2. 캡슐화(encapsulation) : 모델링 / 정보은닉 / 데이터 캡슐화 -대표적으로 은닉화 private / public으로 분류하여 객체 외부에서 사용할 수 있게끔 데이터 접근을 허용할것인지 아닌지가 가능 -연관있는 속성과 메서드를 하나의 클래스로 묶어서 활용
3. 상속성(inheritance) : 재사용 / 확장 -부모클래스에서의 속성과 메서드를 자식클래스에서 그대로 받아서 사용하는 개념 -상속을 통하면 재사용되기 때문에 생산성이 높아짐
4. 다형성(polymorphism) : 사용편의 / 동적바인딩 - 쉽게 예시를 들자면 오버라이팅 / 오버로드를 들 수 있다 -하나의 객체가 여러가지 타입의 형태로 사용할 수 있고 다양한 메서드 형태로 동작을 할 수 있음 -하나의 객체는 다양한 방식으로 동작이 가능함(동적 바인딩 / method dispatch)