개체지향 프로그래밍 및 설계 (Java)
이 과목은 '개체지향 프로그래밍(OOP)'과 '개체지향 분석 및 설계(OOAD)'를 한꺼번에 가르치는 과목으로 OO 언어의 사용법을 배우는데 그치지 않고 실세계를 컴퓨터 프로그램의 개체로 모델링할 수 있는 능력까지 훈련시켜 줍니다. 그 외에 OO 분야의 다양한 주장들이 나오게 된 배경과 각 주장의 장단점, 그리고 그들 사이에서 어떻게 밸런스를 잡아야 훌륭한 프로그래머가 될 수 있는지에 대한 가이드도 제공합니다
배울 내용
- OO의 객관적인 정의
- OOP 모델링/프로그래밍 기법
- 개체지향 분석 및 설계
요구 사항
- '소프트웨어 공학용 수학' 수료
- '실무 프로그래밍 입문 (C#)' 수료
설명
본 비디오 강좌는 POCU아카데미에서 진행하는 COMP2500 수업의 비디오 강좌입니다.
'인간이 생각하는 방식으로 프로그래밍 하자!'라는 야심찬 목표를 가지고 시작한 개체지향 프로그래밍(OOP, Object-Oriented Programming)은 이제 주류 프로그래밍 패러다임이 되었습니다. 허나 기존의 프로그래밍 패러다임(예: 절차적 프로그래밍)에 비해 '인간이 생각하는 방식', 다른 말로 하면 '인간다움'이란 정의는 매우 주관적일 수밖에 없습니다. 각 개인이 속한 환경과 시대에 따라 세상을 보는 눈이 달라지니까요.
이 때문에 특정 OO 언어의 사용법만 익히는 것은 반쪽짜리 OOP 공부입니다. 특정 언어의 사용법은 객관적인 측면일 뿐이니까요. 이 외에 사람의 관점에서 바라본 실세계를 컴퓨터 프로그램의 개체로 모델링할 수 있는 능력(주관적인 측면)을 같이 키워나가야만 제대로 OOP를 배우는 겁니다. 후자는 개체지향 분석 및 설계(OOAD, Object-Oriented Analysis and Design)의 영역으로 본 과목은 OOP와 OOAD(이후 합쳐서 OO라고 표현)를 동시에 가르칩니다.
상술한 주관성 때문에 OO 분야에는 다양한 의견과 주장이 존재해왔습니다. 그리고 어느 시대와 진영의 자료로 공부했느냐에 따라 각 프로그래머가 OO(OOP와 OOAD를 모두 포함)를 이해하는 방식이 많이 다릅니다. 객관성을 추구하는 컴퓨터 과학/공학이라는 학문에 이런 광범위한 주관성은 많은 혼란을 야기합니다. 더 나아가 다른 주장이 나온 이유를 이해하려는 노력 없이 자신이 무비판적으로 수용하며 배운 내용에 기초하여 다른 진영이 무조건 틀렸다고 공격하는 모습들도 OO 분야에서는 종종 발견되는 건설적이지 못한 모습입니다.
이런 문제들을 해결하기 위해 본 과목은 현재 실무에서 다수설로 받아들이는 OO의 정의와 모델링/프로그래밍 기법을 배우는 외에도 이런 다양한 주장들이 나오게 된 배경과 각 주장의 장단점, 그리고 그들 사이에서 어떻게 밸런스를 잡아야 훌륭한 프로그래머가 될 수 있는지에 대한 가이드도 제공합니다.
이 강좌의 대상
- 컴퓨터 공학의 기본기를 배우고 싶은 분들
- 프로그래머로서 평생 커리어를 꿈꾸는 분들
강좌 콘텐츠
- 메인 함수 (5:40)
- 출력문과 가변 인자 (6:16)
- 패키지 (8:42)
- 빌드 및 실행 (10:37)
- 패키지 사용하기 (3:49)
- 복습 퀴즈
- Java의 실행 모델 (6:46)
- Java가 인기가 있었던 이유 (3:38)
- 정수 자료형 (5:31)
- unsigned가 없어서 생기는 문제 (8:29)
- char, boolean, String (4:44)
- 복습 퀴즈 1
- 복습 퀴즈 2
- 리터럴 (4:29)
- final 키워드 (6:20)
- 주석, 연산자 우선순위, 산술 연산자 (5:46)
- 대입 연산자, 논리 연산자, 캐스팅 (8:07)
- 영상 퀴즈 1
- 영상 퀴즈 2
- 영상 퀴즈 3
- 영상 퀴즈 4
- 문자열 비교 (10:09)
- 복습 퀴즈 1
- 복습 퀴즈 2
- 조건문 (3:15)
- 복습 퀴즈
- 반복문 (5:53)
- 영상 퀴즈
- 참조형 인자, 열거형 (11:44)
- 복습 퀴즈
- 람다 (1:59)
- 모듈 (9:39)
- 정리 (2:46)
- 클래스와 개체 (7:38)
- 간단한 클래스 코드 (8:32)
- 복습 퀴즈
- 개체 만들기와 메모리 (8:47)
- 개체 멤버에 접근하기, 참조형 (12:34)
- 복습 퀴즈
- 멤버 변수의 초깃값, . 연산자 (5:28)
- 개체의 메서드 호출하기 (8:08)
- 복습 퀴즈
- 생성자 (11:23)
- 생성자로 초기화를 해야 하는 이유 (11:01)
- 코드보기: Vehicle 클래스 (13:24)
- 복습 퀴즈
- 정리 (2:02)
- 접근 제어자 (9:37)
- 일반적인 접근 제어자, private 메서드의 용도 (7:20)
- 패키지 접근 제어자 (5:10)
- 복습 퀴즈
- getter, setter (8:47)
- setter 베스트 프랙티스 (10:50)
- 복습 퀴즈
- 캡슐화, 추상화 (9:02)
- 정리 (1:56)
- OO 설계에서 처음 만나는 난관 (3:54)
- 클래스 다이어그램 소개 (8:31)
- 클래스 다이어그램 (4:59)
- 모델링할 문제 소개 (1:54)
- 모델링 1: 분무기 상태 (4:30)
- 모델링 2: 분무기 동작 (9:31)
- 모델링 3: 분무기 용량 추가 (6:53)
- 모델링 4: 수도꼭지 (5:44)
- 모델링 5: 화분 (10:12)
- 모델링 6: OO적 상호작용 (8:50)
- 모델링 7: 부품으로 분리해보기 (9:31)
- 유연성 높은 설계가 최고가 아니다! (7:06)
- 복습 퀴즈
- 기본기의 중요성 (3:04)
- 모델링 8: 다시 사용성 높이기 (6:46)
- 코드보기: POCU Tunes (12:00)
- 정리 (2:43)
- 정적 메서드 (7:30)
- 정적 클래스와 생성자 (7:16)
- 정적 멤버 변수 (5:25)
- 정적 메서드에서 멤버 변수 접근하기 (8:07)
- 코드보기: 정적 Logger 클래스 (10:49)
- 복습 퀴즈 1
- 복습 퀴즈 2
- static에 대한 비판 (8:11)
- 디자인 패턴 소개 (10:11)
- 디자인 패턴의 장단점 (8:20)
- 디자인 패턴의 실제 목적 (7:09)
- 디자인 패턴이 비판받는 실제 이유 (8:03)
- 디자인 패턴 공부법 (9:36)
- 싱글턴 패턴 (4:50)
- 싱글턴 패턴 예 (5:21)
- 싱글턴 패턴 vs static (6:35)
- 싱글턴 패턴의 응용 (11:24)
- 코드보기: 싱글턴 Logger 클래스 (4:28)
- 내포 클래스 소개 (3:56)
- 내포 클래스를 사용 안 할 경우 (6:50)
- 비정적 내포 클래스를 사용할 경우 (5:21)
- 정적 내포 클래스를 사용할 경우 (5:50)
- 복습 퀴즈
- 정리 (6:58)
- 상속, 부모/자식 클래스 소개 (9:19)
- 상속 예 소개 (4:25)
- 중복 코드를 클래스로 분리하기 (3:55)
- 상속하기 (4:26)
- 영상 퀴즈
- 생성자 호출 순서 (10:40)
- 부모 클래스의 독립성, 클래스 다이어그램 (5:21)
- 부모 멤버에 접근하기 (10:56)
- 복습 퀴즈
- 상속의 상속 (7:37)
- 복습 퀴즈
- is-a, has-a 관계 (5:11)
- is-a 관계와 부모형 변수 (8:18)
- 상속과 명시적 캐스팅 (4:25)
- 복습 퀴즈
- instanceof 연산자 (5:46)
- 복습 퀴즈
- 클래스 정보와 Object 클래스 (6:52)
- 코드보기: Base Entity (10:19)
- 코드보기: 클래스 정보 찾기 (5:58)
- 정리 (4:15)
- 사람에게 상속이 어려운 이유 (4:33)
- 상속을 이해하는 방법 (5:42)
- 모델링할 대상 소개 (1:31)
- 아날로그 벽시계의 기본 상태와 메서드 (5:45)
- setter에서 예외 던지기 (4:29)
- 예외 없이 시간 바꾸기 (8:03)
- 받아올림도 하는 시간 바꾸기 (6:00)
- 시간적 결합을 해결한 시간 바꾸기 (9:57)
- 아날로그 벽시계의 기타 메서드들 (2:09)
- 디지털 벽시계 분석 및 공통부분 찾기 (9:39)
- 오전/오후 구분하기 (8:03)
- 24시간 체제를 사용하려면? (2:59)
- 디지털 벽시계 시간 맞추기 (3:15)
- 7 세그먼트 디스플레이 추가하기 (5:54)
- 상속을 하는 프로그래머의 사고방식 (2:57)
- 손목시계 추가하기와 다중 상속 (7:53)
- 다중 상속이 생기는 이유와 해결법 (3:54)
- 깊은 상속의 어려움과 생물 분류 (5:37)
- 어류 모델링 (7:34)
- 개, 새 (5:59)
- 정리 (2:26)
- OO에서 재사용성을 중요시하는 이유 (3:27)
- 클래스를 재사용하면 좋은 점 (9:27)
- OO 모델링 실력 높이는 법 (9:51)
- 상속 vs 컴포지션 선택 시 4가지 기준 (5:43)
- 상속 vs 컴포지션: 메모리 (11:57)
- 복습 퀴즈
- 상속 vs 컴포지션: 다형성 (2:26)
- 상속 vs 컴포지션: 유지보수 (3:50)
- 상속 vs 컴포지션: 일반적인 경우 (7:03)
- 복습 퀴즈
- 코드보기: 그래픽 개체 그리기 (6:46)
- 상속과 잦은 클래스 변경 (5:58)
- 영상 퀴즈
- 엔티티 컴포넌트 시스템 (9:21)
- 복습 퀴즈
- 코드보기: 텍스트 파일로부터 엔티티 만들기 (4:41)
- 정리 (3:56)
- 다형성, polymorphism의 단어 뜻 (4:21)
- 간단한 다형성 예 코드로 옮기기 (8:51)
- 무늬 vs 실체 (3:20)
- 영상 퀴즈
- 다형성의 의미 풀이 (3:08)
- 코드로 본 다형성의 의미 (7:35)
- 복습 퀴즈
- 오버라이딩은 선택사항 (4:35)
- 다형성의 장점 (9:34)
- 늦은 바인딩 vs 이른 바인딩 (5:55)
- C 함수 포인터와의 비교 (8:51)
- 바인딩과 성능, 오버라이딩 막기 (14:00)
- 복습 퀴즈
- 다형성 적용 예 (6:42)
- 코드보기: 마법사 (13:00)
- Object 클래스와 toString() (4:46)
- equals() 메서드 (8:06)
- hashCode() 메서드 (6:10)
- 코드보기: 개체 비교 (7:19)
- 코드보기: 해시값 계산 (5:22)
- 정리 (6:31)
- 인터페이스의 사전적 의미 (3:26)
- 인터페이스와 함수 포인터 (8:34)
- 인터페이스는 순수 추상 클래스 (6:09)
- 추상 클래스를 인터페이스로 바꾸기 (4:54)
- 인터페이스 미구현과 컴파일 오류 (3:32)
- 영상 퀴즈
- Java 어노테이션 (6:54)
- 인터페이스의 접근 제어자 (5:21)
- 인터페이스의 이름 (5:32)
- 여러 인터페이스 구현하기 (7:42)
- 인터페이스와 다중 상속 (8:03)
- 복습 퀴즈
- 코드보기: 위젯(Widget) (9:27)
- Object.clone() (8:27)
- 코드보기: 복사 생성자 (4:05)
- 구체 클래스 vs 인터페이스 (1:21)
- 복습 퀴즈
- 정리 (5:36)
- 의존성과 결합도 (7:26)
- OO에서 논하는 결합도 (8:57)
- 영상 퀴즈
- 결합도 판정 (6:41)
- 의존성 주입(DI) (6:05)
- 상속 관계에서의 결합도 (6:21)
- 복습 퀴즈
- 디커플링이 적합한 곳들 (3:46)
- 디커플링의 단점 1 (7:51)
- 디커플링의 단점 2 (7:02)
- 모든 건 인터페이스여야 한다는 주장 (8:57)
- 인터페이스의 잘못된 이해 (8:14)
- 인터페이스에 대해 프로그래밍하라는 의미 (1:30)
- 인터페이스의 올바른 정의 (7:45)
- 이클립스 API와 인터페이스 (9:29)
- 중요한 건 클라이언트와의 약속 (10:13)
- 변화에 대비해야 하는가? (3:22)
- 복습 퀴즈
- 정리 (5:01)
- 디자인 패턴 공부 시 주의할 점 (5:25)
- 팩토리 메서드 패턴 (4:15)
- 다형적인 팩토리 메서드 패턴 1 (5:18)
- 다형적인 팩토리 메서드 패턴 2 (5:16)
- 빌더 패턴과 StringBuilder (4:44)
- 빌더 패턴과 플루언트 인터페이스 (5:30)
- 잘못 사용하는 빌더 패턴 (4:11)
- 영상 퀴즈
- 빌더 패턴 없는 올바른 문제 해결법 (6:28)
- 다형적인 빌더 패턴 (9:34)
- 시퀀스 다이어그램 (7:30)
- 래퍼 패턴 (8:34)
- 래퍼 패턴과 그래픽 API (9:05)
- 래퍼 패턴과 DTO (5:02)
- 프록시 패턴 (4:56)
- 프록시 패턴과 이미지 로딩 (5:07)
- 즉시로딩 vs 지연로딩 (8:27)
- 프록시 패턴의 현대화 예 (5:24)
- 책임 연쇄 패턴과 로거 (9:04)
- 올바른 책임 연쇄 패턴 예 (6:36)
- 옵저버 패턴과 pub-sub 패턴 (5:27)
- 옵저버 패턴 예 (5:50)
- 옵저버 패턴과 메모리 누수 문제 (5:19)
- 복습 퀴즈
- 정리 (3:10)
- try/catch/finally (6:30)
- try/catch 사용 예 (4:14)
- finally 사용 예 (6:29)
- 예외 다시 던지기(rethrow) (4:01)
- 나만의 예외 만들기 (4:41)
- 오류를 방치하면 일어나는 일 (10:19)
- 예외 처리를 제대로 하지 못하는 이유 (7:59)
- Java의 checked 예외 (7:12)
- checked 예외의 존재의의 (5:06)
- 예외로부터 안전한 프로그래밍 (5:37)
- 근래의 예외 처리 트렌드 (6:19)
- 잘못된 예외 처리 가이드를 조심하자 (7:44)
- 제어 흐름용으로 예외를 사용하지 말 것 (6:53)
- 예외적인 상황에만 예외를 사용해야 하는 경우 (8:37)
- 오류 상황, 예외 상황 (5:49)
- 4가지 오류 상황 처리법 (5:24)
- 오류 상황을 피하는 게 최고 (9:59)
- '무시'와 '종료' 방법 (6:02)
- '수정'과 '예외' 방법 (7:32)
- 예외는 OO의 일부가 아니다 (5:16)
- 잘못된 예외처리보다 크래시가 낫다 (9:19)
- 프로그램 종료도 올바른 방법이다 (3:45)
- 4가지 처리법의 순위 (7:30)
- 예측 가능한 상황의 처리법 (7:17)
- 예측 불가한 상황의 처리법 (4:08)
- 정리 (3:06)