본문으로 건너뛰기

객체지향 언어

개요

  • 객체들의 모임으로 프로그램을 작성함
  • 코드의 재활용성이 높음
  • 시스템 확장이 매우 용이함

종류

  • JAVA
  • Python
  • C++
  • Smalltalk 등

구성 요소

  • 객체(Object)
  • 클래스(Class)
  • 메시지(Message)

특성

  • 캡슐화
  • 정보은닉
  • 추상화
  • 상속성
  • 다형성



1. 절차형 vs 객체지향

절차형 프로그래밍 언어객체지향 프로그래밍 언어
- 작업의 순서가 중요함
- 함수들의 집합
- 객체들 간의 상호작용이 중요함
- 클래스, 객체들의 집합

2. 객체지향 프로그래밍 언어의 종류별 특징

JAVA

  1. 멀티스레드 기능을 제공(동시에 여러 작업 처리 가능)
  2. 분산 네트워크 환경에 적용
  3. 캡슐화가 가능
  4. 재사용성이 높음

C++

  1. C언어에 객체지향 개념을 적용
  2. 객체를 중심으로 모델링하여 표현

Smalltalk

  1. 1세대 객체지향 프로그래밍 언어 중 하나
  2. 최초로 GUI를 제공하는 언어

3. 클래스

Class

객체의 모양을 선언한 틀

  • 속성과 메소드를 가짐
Object

객체

  • 클래스의 모양을 토대로 생성된 실체
속성(Attribute)메소드(Method)
- 하나의 클래스 내에 속한 개체들이 가지고 있는 데이터 값들을 단위별로 정의함
- 성질, 분류, 식별, 수량 등의 상태를 표현함
- 함수와 같은 표현으로, 객체의 실행 및 연산을 정의함
- 객체의 상태를 참조하거나 변경하는 수단으로 사용함

4. 객체(Object)

개념

  • 클래스의 모양을 그대로 가진 실체
  • 데이터 속성과 연산을 결합시킨 실체

특징

  • 프로그램 실행 중 생성됨
  • 메모리 공간을 가짐
  • '인스턴스' 라고도 함
클래스객체
사람학생1, 학생2, 교수1, 교수2, 회사원...
자동차벤쓰, 비엠더, 아우리...
과자고깔콘, 콘집, 양파닝...
  • 서로 다른 속성과 메소드를 가짐

5. 객체지향 프로그래밍 언어의 특징


캡슐화

데이터와 데이터를 처리하는 함수를 하나로 묶은 것

  • 캡슐화된 객체의 세부내용이 외부의 은폐 == 오류 위험 감소
  • 캡슐화된 객체들은 재사용이 용이
상자 객체

캡슐화된 상자 안에는 복잡한 회로, 부품이 들어있을 수 있음

정보은닉

  • 캡슐화에서 가장 중요한 개념
  • 다른 객체에게 자신의 정보를 숨김
  • 자신의 연산만을 통하여 접근을 허용함

추상화

  • 불필요한 부분을 생략하고 개략화하여 표현함
  • 데이터의 공통된 성질을 추출하여 슈퍼클래스를 선정함

상속성

  • 상위 클래스의 모든 속성과 연산을 하위 클래스가 물려받음
  • 상속성에 의하여 하위 클래스는 상위 클래스에서 정의한 속성과 연산을 재정의하지 않고 사용할 수 있음
JAVA
class Cry{
public void sound(){
System.out.printIn("소리");
}
}

class Dog extends Cry{
System.out.printIn("멍멍");
}

class Cat extends Cry{
System.out.printIn("야옹");
}

다형성

  • 동일한 메소드가 객체나 클래스에 따라 다르게 작동
  • 동일한 메소드를 사용하여 각 개체는 다르게 구현 가능
이름이 같은 함수를 사용하되, 매개변수의 개수를 달리 하여 구현
  • 두 수를 더한다
  • 세 개의 수를 더한다
  • n 개의 수를 더한다
이름이 같은 함수를 사용하되, 내부의 내용이 모두 다를 수 있음

6. JAVA를 활용한 절차적 프로그램의 핵심 문법

public static void main(String[] args){
...
}

public : 접근 지정자. 메소드는 public (누구에게나 공개)
static: 객체 생성 전 부터 호출 가능
void: 리턴값 없음
String[]: 문자열의 배열
args: 매개 변수

7. JAVA를 활용한 객체지향 프로그램

자료타입

  • 기본 타입

    타입크기타입크기타입크기
    Boolean1bitchar2bytebyte1byte
    short2byteint4bytefloat4byte
    double8byte
  • 레퍼런스 타입

연산자

구분내용
증감++, --
산술+, -, *, /, %
시프트>>, <<
비교>, >=, <=, <=, ==, !=
논리&&, , !, ^
조건?, :
비트&, , !, ^

제어법 - 조건문

조건문

조건에 따라 실행

조건문 - 단순 if
if (val == 80) {
System.out.printIn("average");
}
System.out.printIn("stop");
실행 결과
-- val 이 80인 경우
average
stop

-- val 이 80이 아닌 경우
stop

조건문 - if ~ else
if (num % 2 == 0) System.out.printIn("even number");
else System.out.printIn("odd number");
실행 결과
-- num이 짝수인 경우
even number

-- num이 홀수인 경우
odd number

조건문 - cond ? stat1 : stat2;
// if ~ else 문
if (i > j)
max = i;
else
max = j;

// cond ? stat1 : stat2;
int max = (i > j) ? i : j;

// 둘의 결과 값은 동일함

조건문 - switch ~ case
int score = scanner.nextInt();
switch (score / 10) {
case 10:
case 9:
grade = 'A';
break;
case 8:
grade = 'B';
break;
case 7:
grade = 'C';
break;
default:
grade = 'F';
}
  • default 문 생략 가능함
  • case의 값
    • 문자
    • 정수
    • 문자열
    • 실수(x) (ex: 1.1)
    • 수식(x) (ex: i >= 100)
    • 변수(x) (ex: i)

제어법 - 반복문

반복문 - for
// 1
int i;
for (i = 0; i < 10; i++){
System.out.print(i);
}

// 2
int i, sum;
for(i= 0, sum=0; i<= 100; i++)
sum += i;

// 3
int sum = 0;
for(int i = 0; i <= 100; i += 2)
sum += i;

// 4
int sum = 0;
for(int i= 100; i>= 0; i--)
sum += i;


반복문 - while
int n = a.nextInt(); // 정수 입력
int sum = 0;
int count = 0;

while(n != -1){
sum += n;
count++;
n = a.nextInt(); // 정수 입력
}

반복문 - do ~ while문 으로 A ~ Z 까지 출력
char a = 'A';

do {
System.out.printIn(a);
a = (char)(a + 1);
} while {
a <= 'Z';
}


클래스
  • 객체의 모양을 선언한 것 (객체의 캡슐화)
  • 메소드 : 함수
  • 속성 : 변수로 구성
객체
  • 고유한 특성화 행동을 가짐
  • 클래스의 틀대로 생성된 instance
객체의 캡슐화
  • 내부의 모습을 볼 수 없게 하는 것 (외부로부터 객체 보호)

객체의 상속

  1. 맴버를 중복하여 작성할 필요가 없음, 클래스가 간결해짐
  2. 클래스들의 계층적 분류가 가능하므로 클래스 관리가 쉬움
  3. 클래스의 재사용과 확장이 용이하므로 소프트웨어의 생산성 향상
  4. extends 키워드를 사용하여 슈퍼클래스를 확장 가능

부모 클래스 : '슈퍼클래스'로 부를 수 있음
자식 클래스 : '서브클래스'로 부를 수 있음

상위 클래스 예시
class 할아버지 {
String n;
void walk();
void speak();
}
하위 클래스 예시
class 아빠 extends 할아버지 { // 클래스 '할아버지'를 상속받는 클래스 '아빠' 선언
String address;
void work();
void learn();
}

class 아들 extends 아빠 { // 클래스 '할아버지'를 상속받는 클래스 '아빠' 선언
String underwear;
void cry();
void listen();
}

객체의 다형성

  • 같은 이름을 가진 클래스 또는 객체가 다른 동작이 가능함
메소드 오버로딩

이름이 같으나 행동이 다름

메소드 오버로딩 예시
class MethodOverloading {
public int getSum(int i, int j){
return i + j;
}
public int getSum(int i, int j, int k){
return i + j + k;
}
}

메소드 오버라이딩

슈퍼클래스의 메소드를 서로 다르게 구현함

메소드 오버로딩 예시
class Cry {
public void sound() {
System.out.printIn("Sound");
}
}

class Dog extends Cry {
System.out.printIn("mungmung");
}

class Cat extends Cry {
System.out.printIn("Meow");
}

객체의 소멸

new에 의하여 할당된 객체의 메모리를 반환하는 행위

  1. JAVA는 자동으로 소멸
  2. 가비지 콜렉션에 의해 가비지 수집 / 반환(자동으로 실행)
  3. 강제 가비지 콜렉션을 시도할 경우, System.gc() 호출

객체의 활용

배열

  • 선언

    // 배열 타입(int), 배열 레퍼런스(test1), 배열 선언[];
    int test1[];
    char test2[]
  • 생성

    // 배열 레퍼런스(test1), 배열 생성(new), 타입(int), 원소갯수(number)
    test1 = new int[10]();
    test2 = new char[20]();
  • 선언과 생성을 한 줄에

    int test1[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9} // 초기화된 값의 개수(10) 만큼의 배열 생성

배열을 활용하여 객체 생성
arr[] p; // arr 배열에 대한 레퍼런스 변수 p 선언
p = new arr[5];
lg = p.length;

for(int i = 0; i < lg; i++)
p[i] = new arr(i)
실행 결과
p[0] = new arr(0)
p[1] = new arr(1)
p[2] = new arr(2)
p[3] = new arr(3)
p[4] = new arr(4)

배열을 사용하여 순차적으로 접근 - for-each
int[] val = { 1,2,3,4,5 };
int sum = 0;
for (int j: val) // 반복될 때 마다 j는 val[0], val[1], 값으로 설정
sum += j;

System.out.println("합은" + sum);
실행 결과
합은 15

배열을 사용하여 순차적으로 접근 - for-each
String names[] = { "하나", "둘", "셋", "넷", "다섯" };
for (String s: names) // 반복될 때 마다 s는 names[0], names[1], ...
System.out.println(s + " ");
실행 결과
하나



다섯