ㅇ 필요성 -> 서로 밀접한 관계가 있는 함수와 변수를 묶어두면 코드 관리가 용이 -> 클래스(설계도), 인스턴스(설계도를 통해 실제로 만들어진 것)
1. 클래스 ㅇ 기본 -> 멤버 변수 : 클래스에 종속된 변수 -> 메서드 : 클래스에 종속되는 함수, 클래스의 기능을 정의한 함수 -> this 키워드 : 클래스 내부의 속성을 지칭하고 싶을 때, 현재 클래스를 의미 -> 스코프 안에 같은 속성 이름이 하나만 존재하면 this 생략 가능
ㅇ 생성자 -> 클래스의 인스턴스를 생성하는 메서드(설계도의 실제물건을 생성하는 기능) -> 생성자에서 입력받을 변수 -> 일반적으로 final로 선언(인스턴스화한 다음에 혹시라도 변수의 값을 변경하는 실수를 막기 위함)
ㅇ 프라이빗 변수 -> 다트에서의 프라이빗 변수는 다른 언어와 정의가 약간 다름 -> 일반적 : 클래스 내부에서만 사용하는 변수를 칭함 -> 다트 : 같은 파일에서만 접근 가능한 변수 (다른 파일에서는 접근 불가) -> '_변수명' 의 형태로 프라이빗 변수 선언 가능
2. 상속 ㅇ 공유되는 기능을 상속받는 개념 ㅇ extends 키워드 사용 ㅇ 어떤 클래스의 기능을 다른 클래스가 사용할 수 있게 하는 기법 ㅇ 부모 클래스 : 기능을 물려주는 클래스 ㅇ 자식 클래스 : 물려받는 클래스, 부모 클래스의 모든 기능을 상속받는다. ㅇ 현재 클래스를 지칭하는 this, 부모클래스를 지칭하는 super(부모클래스에 기본 생성자가 있기때문에 부모클래스의 생성자를 실행해줘야함) ㅇ 부모 클래스에 공통으로 사용하는 변수와 메서드를 정의하면 자식 클래스들은 해당 값들을 사용할 수 있어 중복 코딩이 필요없어짐
3. 오버라이드 ㅇ 부모 클래스 or 인터페이스에 정의된 메서드를 재정의할 때 사용 ㅇ 다트에선 override 키워드 생략 가능 -> 직접 명시하는 게 협업 및 유지보수에 유리
4. 인터페이스 ㅇ 공통으로 필요한 기능을 정의만 해두는 역할 ㅇ 다트에는 인터페이스를 지정하는 키워드는 따로 없음 ㅇ implement 키워드 사용 ㅇ 반드시 모든 기능을 다시 정의해줘야 함 (애초에 반드시 재정의할 필요가 있는 기능을 정의하는 용도)
5. 믹스인 ㅇ 특정 클래스에 원하는 기능들만 골라넣을 수 있는 기능 ㅇ 특정 클래스를 지정해서 속성들을 정의할 수 있음 ㅇ 지정한 클래스를 상속하는 클래스에서도 사용 가능 ㅇ 인터페이스처럼 한 개의 클래스에 여러 개의 믹스인을 적용할 수 있음(여러 믹스인을 적용하고 싶으면, 기호로 열거) ㅇ with 키워드 사용
6. 추상 ㅇ 상속이나 인터페이스로 사용하는 데 필요한 속성만 정의하고 인스턴스화할 수 없도록 하는 기능 ㅇ 따로 인스턴스화할 일이 없다면 추상 클래스로 선언해서 인스턴스화를 방지하고, 메서드 정의를 자식클래스에 위임할 수 있음 ㅇ 추상 메서드를 선언할 수 있음 -> 함수의 반환 타입, 이름, 매개변수만 정의하고 함수 바디의 선언을 자식 클래스에서 필수로 정의하도록 강제함 ㅇ 추상 클래스는 선언까지만 해주면 됨 ㅇ abstract 키워드 사용 ㅇ 추상 클래스를 사용하는 클래스에서 추상 클래스에 적용된 메서드를 하나라도 정의하지 않으면 에러 발생 ㅇ 부모 클래스를 인스턴스화할 일이 없고, 자식 클래스들에 필수적으로 또는 공통적으로 정의돼야 하는 메서드가 존재할 때 사용 ㅇ "추상 클래스는 인스턴스화가 필요 없는 공통 부모 클래스를 만들 때 사용한다"
7. 제네릭 ㅇ 클래스나 함수의 정의를 선언할 때가 아니라 인스턴스화하거나 실행할 때로 미룸 ㅇ 특정 변수의 타입을 하나의 타입으로 제한하고 싶지 않을 때 자주 사용 ㅇ Map, List, Set 등에서 사용한 <> 사이에 입력되는 값 ㅇ T : 변수타입 표현, E : 리스트 내부 요소들의 타입 표현, K : 키를 표현, V : 값을 표현
8. 스태틱(정적) ㅇ static 키워드 사용 ㅇ 클래스 자체에 귀속, 다른 변수와 메서드 등 모든 속성은 각 '클래스의 인스턴스'에 귀속 ㅇ 클래스에 직접 귀속되기 때문에 생성자에서 static값을 지정하지 못함 ㅇ 인스턴스끼리 공유해야 하는 정보에 지정하면 됨
9. 캐스케이드 연산자 ㅇ 인스턴스에서 해당 인스턴스의 속성이나 멤버 함수를 연속해서 사용하는 기능 ㅇ .. 기호 사용 ㅇ 더 간결한 코드 작성 가능
* 플러터의 모든 위젯은 객체지향 프로그래밍을 통해 구현 -> 위 내용을 제대로 이해하는게 매우 중요 -> 객체지향 프로그래밍을 통해 중복 코드를 줄이고 정리가 잘된 효율적인 코드를 작성하는 건 개발자의 필수 덕목