Lecture 04 객체지향 페러다임 Kwang-Man Ko kkmam@sangji.ac.kr, compiler.sangji.ac.kr Department of Computer Engineering Sang Ji University 2018
객체 지향 페러다임 개요 객체(object)의 개념 객체는 현실 세계의 객체를 필드와 메서드로 모델링한 것 객체는 상태를 필드로 정의하고, 동작을 메서드로 정의. 필드는 객체 내부에 선언된 변수를 의미하고, 메서드는 객체 내부에 정 의된 동작
객체 지향의 개요 절차 지향 프로그래밍 일련의 동작을 순서에 맞추어 단계적으로 실행하도록 명령어를 나열 데이터를 정의하는 방법보다는 명령어의 순서와 흐름에 중점 수행할 작업을 예상할 수 있어 직관적인데, 규모가 작을 때는 프로그래 밍과 이해하기가 용이 소프트웨어는 계산 위주이므로 절차 지향 프로그래밍이 적합
객체 지향 프로그래밍 소프트웨어의 규모가 커지면서 동작과 분리되어 전 과정에서 서로 복잡 하게 얽혀 있는 데이터를 사용했기 때문에 절차 지향 프로그래밍 방식 의 한계 절차 지향 프로그램은 추후 변경하거나 확장하기도 어려움 현실 세계를 객체 단위로 프로그래밍하며, 객체는 필드(데이터)와 메서 드(코드)를 하나로 묶어 표현
객체 지향의 개요 객체와 클래스
객체 지향 프로그래밍 ( OOP ) 캡슐화 Encapsulation (정보 은닉 Information hiding) 관련된 필드와 메서드를 하나의 캡슐처럼 포장해 세부 내용을 외부에서 알 수 없도록 감추는 것
객체 지향 프로그래밍 상속 (inheritance) 상위 객체를 상속받은 하위 객체가 상위 객체의 메서드와 필드를 사용 하는 것 상속은 개발된 객체를 재사용(reusability)하는 방법 중 하나
객체 지향 프로그래밍 다형성 (polymorphism) 대입되는 객체에 따라서 메서드를 다르게 동작하도록 구현하는 기술. 실행 도중 동일한 이름의 다양한 구현체 중에서 메서드를 선택 가능
클래스 선언과 객체 생성 추상화 (abstraction) 추상화는 현실 세계의 객체에서 불필요한 속성을 제거하고 중요한 정보 만 클래스로 표현하는 일종의 모델링 기법 사람마다 추상화하는 기법이 같지 않으므로 각 개발자는 클래스를 다르 게 정의 가능
클래스 선언과 객체 생성 클래스 선언 형식 예
클래스 선언과 객체 생성 클래스 선언과 파일 보통 소스 파일마다 하나의 클래스를 선언하지만, 2개 이상의 클래스를 하나의 파일로 선언 가능 하나의 파일에 클래스가 둘 이상 있다면 하나만 public으로 선언할 수 있 고, 해당 클래스 이름은 소스 파일 이름과 동일해야 함
클래스 선언과 객체 생성 객체 생성과 참조 변수 한 문장으로 변수 선언과 객체 생성
클래스 선언과 객체 생성 기초 타입과 참조 타입 new Ball();
클래스 선언과 객체 생성 기초 타입과 참조 타입 예제 : sec03/PhoneDemo.java
클래스의 구성 요소와 멤버 접근 클래스의 구성 요소 멤버 : 필드, 메서드 생성자 참고 : 지역 변수는 메서드 내부에 선언된 변수. 매개 변수도 일종의 지 역 변수임
클래스의 구성 요소와 멤버 접근 필드와 지역 변수의 차이 필드는 기본 값이 있지만, 지역 변수는 기본 값이 없어 반드시 초기화 필드는 기본 값이 있지만, 지역 변수는 기본 값이 없어 반드시 초기화 필드는 클래스 전체에서 사용할 수 있지 만, 지역 변수는 선언된 블록 내부의 선 언된 후에서만 사용 가능 필드와 달리 지역 변수는 final로만 지정 가능 예제 : sec04/LocalVariableDemo.java
클래스의 구성 요소와 멤버 접근 클래스 내부에서 멤버 접근 예제 : sec04/etc/CircleDemo.java this.필드 this.메서드 필드 메서드 혹은
클래스의 구성 요소와 멤버 접근 클래스 외부에서 멤버 접근 예제 : sec04/CircleDemo.java 인스턴스 변수 인스턴스 메서드
접근자와 설정자 필요성 접근자와 설정자 클래스 내부에 캡슐화된 멤버를 외부에서 사용할 필요 private으로 지정된 필드에 값을 반환하는 접근자와 값을 변경하는 설정 자는 공개된 메서드 일반적으로 접근자는 get, 설정자는 set으로 시작하는 이름을 사용 필드 이름을 외부와 차단해서 독립시키기 때문에 필드 이름 변경이나 데이터 검증도 가능 예제 : sec05/CircleDemo.java
생성자 (constructor) 생성자의 의미와 선언 생성자의 역할 : 객체를 생성하는 시점에서 필드를 다양하게 초기화 생성자의 선언 방식. 생성자 이름은 클래스 이름과 동일 생성자의 반환 타입은 없음 생성자는 new 연산자와 함께 사용하며, 객체를 생성할 때 호출 생성자도 오버로딩 가능.
생성자 생성자 사용 기본 생성자 모든 클래스는 최소한 하나의 생성자가 있음 만약 생성자를 선언하지 않으면 컴파일러가 자동으로 기본 생성자 (Default Constructor)를 추가 기본 생성자는 매개변수도 없고 본체에서 실행할 내용도 없는 생성자 예제 : sec06/etc/CircleDemo.java
생성자 생성자 오버로딩 생성자도 메서드처럼 오버로딩(Overloading) 가능 예제 : sec06/CircleDemo.java
생성자 this와 this()
생성자 this와 this() 예제 : sec06/dis/Circle.java 주의 사항
생성자 연속 호출 반환 타입이 void인 setName(String name), setAge(), sayHello()라는 메서 드를 가진 Person 클래스가 있다고 가정 메서드를 호출할 때마다 새로운 실행문을 사용해야 하므로 번거롭고 가독성도 떨어진다.
생성자 연속 호출 만약 setName()과 setAge()의 반환 타입이 this라면 예제 : sec06/MethodChainDemo.java
정적 멤버 (static member) 인스턴스 멤버와 정적 멤버
정적 멤버 인스턴스 멤버와 정적 멤버 인스턴스 변수는 객체별로 관리 객체를 생성할 때 인스턴스 변수도 객체가 소멸될 때는 자동으로 소멸 정적 변수는 클래스 로더가 클래스를 메서드 영역에 적재할 때 생성 정적 메서드의 유의 사항 객체와 관련된 인스턴스 변수를 사용할 수 없다. 객체와 관련된 인스턴스 메서드를 호출할 수 없다. 객체 자신을 가리키는 this 키워드를 사용할 수 없다.
정적 멤버 정적 멤버의 활용 상수는 변경되지 않는 변수이기 때문에 final 키워드로 지정 상수는 값이 변경되지 않으므로 객체마다 따로 기억 공간을 할당할 필 요가 없다. 따라서 static final로 지정해서 선언
예제 : sec07/CircleDemo.java 예제 : sec07/UtilDemo.java
정적 멤버 정적 블록 정적 변수의 초기화가 복잡할 때는 다음과 같이 정적 블록을 사용. 예제 : sec07/OneToTenDemo.java