5장. 객체지향과 클래스
학습목표 객체지향 프로그래밍에 대해 이해하고 설명할 수 있다. 클래스와 객체의 생성을 이해하고 프로그래밍에 활용할 수 있다. • 객체지향과 절차적 프로그래밍 방식 • 클래스와 객체, • 추상화, 캡슐화, 상속, 다형성 클래스와 객체의 생성을 이해하고 프로그래밍에 활용할 수 있다. • 클래스 생성 시 필드와 메소드의 구현 • 키워드 new를 사용한 객체의 생성 • 객체 변수에서 필드와 메소드 참조 방법 • 필드 참조 메소드인 getter와 setter 구현과 사용 방법 생성자 개념과 구현 방법을 이해하고 프로그래밍에 활용할 수 있다. • 생성자의 필요성 • 생성자 구현 방법 • 생성자 오버로딩 개념과 구현 방법 • 다른 생성자 호출하기 위한 this() 키워드 static과 final의 사용 방법을 알고 활용할 수 있다. • 클래스 소속을 위한 static • 변수를 상수로 하기 위한 final
1. 객체지향 프로그래밍의 이해
객체지향 개요 객체지형 프로그래밍 언어 객체지향 프로그래밍 원조는 시뮬라(simula)라는 프로그래밍 언어 Section 1 객체지향 프로그래밍의 이해 p148 객체지향 개요 객체지형 프로그래밍 언어 원조는 시뮬라(simula)라는 프로그래밍 언어 클래스라는 개념을 처음으로 도입 객체지향 프로그래밍 클래스(class)를 생성하고 클래스로부터 객체(object)를 만들어 객체 간의 상호작용을 이용하여 주어진 문제를 해결하는 프로그래밍 방식 데이터인 필드와 절차인 메소드를 하나로 묶은 클래스 단위의 프로그램
Section 1 객체지향 프로그래밍의 이해 필드와 메소드 객체(object) 현실 세계의 사물이나 개념을 시스템에서 이용하기 위해 현실 세계를 자연스럽게 표현하여 손쉽게 이용할 수 있도록 만든 소프트웨어 모델 객체 = 속성(attributes, properties) + 행동(messages, behaviors) 속성 객체의 특성을 표현하는 정적인 성질 프로그래밍에서 속성은 필드(field)라 함 행동 객체 내부의 일을 처리 하거나 객체들간의 서로 영향을 주고 받는 동적인 일을 처리하는 단위 행동은 메소드(method)라 함
객체와 클래스 클래스 객체 객체를 만들기 위한 모형이자 틀(template) Section 1 객체지향 프로그래밍의 이해 객체와 클래스 클래스 객체를 만들기 위한 모형이자 틀(template) 객체를 만들려면 반드시 객체의 다양한 특성을 표현할 수 있는 모형인 클래스가 필요 객체 클래스의 구체적인 하나의 실례(instance) 객체와 클래스의 예
추상화 추상화(abstraction) 현실 세계의 사실에서 주어진 문제의 중요한 측면을 주목하여 설명하는 방식 Section 1 객체지향 프로그래밍의 이해 추상화 추상화(abstraction) 현실 세계의 사실에서 주어진 문제의 중요한 측면을 주목하여 설명하는 방식 실세계의 객체에서 불필요한 부분을 제거하여 필요한 부분만을 간결하고 이해하기 쉬운 클래스로 만드는 작업 속성과 행동으로 추상화를 실현
캡슐화 캡슐화(encapsulation) 정보 은닉(information hiding)이 발생 Section 1 객체지향 프로그래밍의 이해 캡슐화 캡슐화(encapsulation) 객체와 객체 간의 의사 소통을 위한 정보만을 노출 실제 내부 구현 정보는 숨기는 원리 추상화 과정에서 클래스를 정의할 때 객체의 자료와 행위를 클래스 단위로 하나로 묶고, 실제 내부 구현 내용을 외부에 감추는 것 정보 은닉(information hiding)이 발생 캡슐화 과정에서 클래스 내부 구현을 외부에 숨김
상속 ‘물려받는다’라는 특징의 상속(inheritance) 객체지향의 가장 핵심이 되는 개념 Section 1 객체지향 프로그래밍의 이해 상속 ‘물려받는다’라는 특징의 상속(inheritance) 객체지향의 가장 핵심이 되는 개념 프로그램을 쉽게 확장할 수 있도록 해주는 강력한 수단 상위 클래스와 하위 클래스 간의 관계: 계층도 상속 장점 공통의 특성을 하위 클래스마다 반복적으로 기술하지 않고 한 번만 기술하기 때문에 중복을 줄여 재사용성의 효과
다형성 다형성(polymorphism) 원래 생물학적 용어로 외부에 보이는 모습은 한 가지 형태이지만 다형성의 예 Section 1 객체지향 프로그래밍의 이해 다형성 다형성(polymorphism) 원래 생물학적 용어로 여러(poly) 형태(morphy)를 의미 외부에 보이는 모습은 한 가지 형태이지만 실질적으로 쓰이는 기능은 여러 가지 역할을 수행한다는 의미 다형성의 예 오버로딩(overloading)이나 오버라이딩(overriding)
2. 클래스와 객체의 생성
클래스의 필드 구현 필드 구현 다양한 필드 지정자(수정자) 신용카드를 추상화한 클래스 CreditCard를 구현 Section 2 클래스와 객체의 생성 p154 클래스의 필드 구현 필드 구현 신용카드를 추상화한 클래스 CreditCard를 구현 신용카드의 속성 카드번호 number, 소유자 owner 등을 고려 다양한 필드 지정자(수정자)
필드의 기본 값 기본 값 선언 시 초기 값이 없으면 자동으로 저장되는 값 타입에 따라 기본이 되는 0 Section 2 클래스와 객체의 생성 p154 필드의 기본 값 기본 값 선언 시 초기 값이 없으면 자동으로 저장되는 값 타입에 따라 기본이 되는 0
객체 생성과 필드 참조 연산자 키워드 new 필드 참조 연산자 . 객체를 생성하기 위해서는 Section 2 클래스와 객체의 생성 객체 생성과 필드 참조 연산자 키워드 new 객체를 생성하기 위해서는 키워드 new 이후에 CreditCard()와 같이 생성자를 호출 필드 참조 연산자 . 참조형 변수인 myCard를 사용하여 필드 owner와 number를 참조 myCard.owner, myCard.number
Section 2 클래스와 객체의 생성 실습예제 5-1
클래스의 메소드 구현 메소드 구현 수정자 반환형 메소드이름(매개변수) { 구현 } 메소드 use() 메소드 payBill() Section 2 클래스와 객체의 생성 클래스의 메소드 구현 메소드 구현 수정자 반환형 메소드이름(매개변수) { 구현 } 메소드 use() 신용카드를 사용하는 메소드 메소드 payBill() 매월 또는 수시로 카드 비용을 지불하는 메소드 메소스 addPoint() 카드 사용실적에 따른 포인트 합산하는 메소드
Section 2 클래스와 객체의 생성 메소드 지정자 메소드 지정자 또는 수정자 다양한 지정자를 위한 키워드
Section 2 클래스와 객체의 생성 실습예제 5-2 신용카드를 추상화하여 여러 필드와 메소드로 구성된 클래스
클래스로부터 객체 생성 클래스 객체 객체를 만드는 모형 클래스로부터 만들어짐. Section 2 클래스와 객체의 생성 클래스로부터 객체 생성 클래스 객체를 만드는 모형 객체 클래스로부터 만들어짐. new 이후에 CreditCard()와 같이 클래스의 생성자(constructor)를 호출하여 객체를 생성
Section 2 클래스와 객체의 생성 객체의 필드와 메소드 참조 참조 연산자 . 참조 변수의 필드와 메소드를 사용
필드 참조 메소드 getter와 setter 구현 Section 2 클래스와 객체의 생성 필드 참조 메소드 getter와 setter 구현 Setter와 Getter 필드의 값을 저장하는 메소드 setter 필드의 값을 반환하는 메소드 getter 키워드 this 객체 자신을 의미하는 키워드
실습예제 5-4 getter와 setter를 구현한 클래스 CreditCard Section 2 클래스와 객체의 생성 package obj.setter; return number; public class CreditCard { public void setNumber(long number) { public String owner; //카드 소유자 //this.number = number; private long number; //16자리 카드번호 if (number < 1000_0000_0000_0000L) { private int point; //카드 포인트 System.err.println("잘못된 카드 번호입니다."); private int balance; //현재까지 사용액 return; //카드 사용 메소드 public void use(int amount) { this.number = number; balance += amount; } public int getPoint() { //카드 비용 지불 메소드 return point; public void payBill(int amount) { balance -= amount; public void setPoint(int point) { addPoint(amount); this.point = point; //카드 포인트 추가 메소드 public int getBalance() { private void addPoint(int amount) { return balance; point += amount/1000; public void setBalance(int balance) { this.balance = balance; //setter & getter public long getNumber() {
실습예제 5-5 클래스 CreditCard의 객체 생성과 getter와 setter 사용 Section 2 클래스와 객체의 생성 실습예제 5-5 클래스 CreditCard의 객체 생성과 getter와 setter 사용
Section 2 클래스와 객체의 생성 이클립스 팁 getter와 setter의 생성
3. 생성자
생성자 구현(1) 생성자 개요 생성자의 구성 객체를 만드는 틀인 클래스에서 필요하면 생성자를 구현 Section 3 생성자 p164 생성자 구현(1) 생성자 개요 객체를 만드는 틀인 클래스에서 필요하면 생성자를 구현 객체가 생성될 때 필요한 작업을 수행하는 특별한 메소드 주로 객체 필드에 초기 값을 저장하거나 객체의 사용을 위해 필요한 초기화 작업이 수행 생성자의 구성 반환형을 기술하지 않으며 이름은 반드시 클래스 이름 생성자의 인자는 필요하면 기술 생성자는 주로 접근 지정자 public을 사용 만일 필요하다면 생성자의 접근 지정자도 private 또는 protected도 가능
Section 3 생성자 생성자 구현(2) 클래스 student의 생성자
Section 3 생성자 객체 생성을 위한 생성자 호출
기본 생성자(1) 기본 생성자(default constructor) 인자가 없는 생성자 Section 3 생성자 기본 생성자(1) 기본 생성자(default constructor) 인자가 없는 생성자 클래스 Student에서 생성자가 하나도 구현되지 않았다면 new Student()와 같이 인자가 없는 생성자를 호출하여 객체를 생성 생성자를 전혀 구현하지 않은 클래스는 자동으로 기본 생성자를 제공
기본 생성자(2) 클래스에서 인자가 있는 생성자가 적어도 하나 구현되었다면 더 이상 기본 생성자는 자동으로 사용 불가능 Section 3 생성자 기본 생성자(2) 클래스에서 인자가 있는 생성자가 적어도 하나 구현되었다면 더 이상 기본 생성자는 자동으로 사용 불가능 기본 생성자를 사용하려면 기본 생성자도 직접 구현해야 함
Section 3 생성자 실습예제 5-7 학생을 위한 클래스의 생성자 구현과 객체 생성
생성자 오버로딩 필요한 여러 생성자 구현 생성자 오버로딩(constructor overloading) Section 3 생성자 생성자 오버로딩 필요한 여러 생성자 구현 생성자 오버로딩(constructor overloading) 하나의 클래스에서 인자가 다르면 생성자를 여러 개 구현 가능
Section 3 생성자 실습예제 5-8 클래스 CreditCard의 여러 생성자 활용
자기 자신의 다른 생성자 호출 this(…) 구현된 자기 자신의 다른 생성자를 호출하는 문장 생성자 구현에서 첫 줄에는 Section 3 생성자 자기 자신의 다른 생성자 호출 this(…) 구현된 자기 자신의 다른 생성자를 호출하는 문장 생성자 구현에서 첫 줄에는 this(인자)로 다른 생성자를 호출하여 사용 가능 두 번째 줄부터는 사용 불가
실습예제 5-10 자동차를 표현한 클래스 Section 3 생성자 package obj.constructor; //maxSpeed의 setter와 getter public class Car { public int getMaxSpeed() { private int maxSpeed; //최고 속도 return maxSpeed; public String brandName; //브랜드이름 public int speed; //현재 속도 public void setMaxSpeed(int maxSpeed) { //브랜드 이름을 지정하는 생성자 public Car(String brandName) { this.brandName = brandName; public static void main(String[] args) { } Car mycar = new Car("포르쉐", 300); //브랜드 이름과 최고 속도를 지정하는 생성자 mycar.speedUp(); public Car(String brandName, int maxSpeed) { this(brandName); System.out.print("차종: " + mycar.brandName); this.maxSpeed = maxSpeed; System.out.print(", 최고 속도: " + mycar.getMaxSpeed()); System.out.println(", 현재 속도: " + mycar.speedDown()); //속도 관련 메소드 public int speedUp() { return speed += 30; public int speedDown() { return speed -= 20;
4. 정적인 속성을 위한 static과 상수를 위한 final
정적 필드와 메소드를 위한 키워드 static(1) Section 4 static과 final p174 정적 필드와 메소드를 위한 키워드 static(1) 키워드 static 필드나 메소드의 소속을 클래스로 제한하는 키워드 static을 사용한 정적 변수나 정적 메소드는 클래스 변수와 클래스 메소드 정적 필드 PI 클래스에 소속된 저장공간이 하나만 존재하는 변수 할당되는 객체에는 저장공간이 없음 비정적 필드 radius 할당되는 객체마다 저장공간이 할당되는 객체 소속 변수 정적 필드 참조 방법 정적 필드는 Circle.PI와 같이 클래스이름.정적필드로 참조하는 방법이 원칙 c1.PI나 c2.PI와 같이 객체 이름으로도 참조 가능
정적 필드와 메소드를 위한 키워드 static(2) Section 4 static과 final 정적 필드와 메소드를 위한 키워드 static(2)
Section 4 static과 final 실습예제 5-11 클래스 Circle에서 원주율 PI를 정적으로 선언하여 사용
변수를 상수로 만드는 final 지역 변수의 상수 소속 변수인 필드를 상수로 선언하기 위해 키워드 final을 명시 Section 4 static과 final 변수를 상수로 만드는 final 지역 변수의 상수 키워드 final을 명시 저장된 값을 더 이상 수정할 수 없도록 소속 변수인 필드를 상수로 선언하기 위해 static도 함께 사용하여 정적으로 하는 것을 권유
Section 4 static과 final 실습예제 5-13 클래스 Circle에서 면적과 원의 둘레 길이 구하기
Thank You !