본문 바로가기

JAVA

객체지향 프로그래밍

1. 객체 지향 언어

객체지향이론의 기본 개념은 ‘실제 세계는 사물(객체)로 이루어져 있으며, 발생하는 모든 사건들은 사물간의 상호작용이다.’

1.2 객체지향 언어

기존 언어의 발전된 형태임. 코드간의 서로 관계를 맺어 줌으로써 보다 유기적으로 프로그램을 구성.

객체지향언어의 주요 특징

  • 코드의 재사용성이 높고 유지보수 용이
  • 코드의 관리가 용이함
  • 신뢰성이 높은 프로그래밍 가능(제어자와 메서드 이용)
    • 중복된 코드제거

 

2. 클래스와 객체

2.1 클래스와 객체의 정의와 용도

클래스란?

  • 객체를 정의해놓은 것(정의), 객체의 설계도 또는 틀(클래스:붕어빵틀, 인스턴스 : 붕어빵)
  • 객체를 생성하는데 사용(용도)
  • 객체 그 자체는 아니다.

객체?

  • 실제로 존재하는 것, 개념이나 논리, 클래스에 정의된 내용대로 메모리에 생성된 것

2.2 객체와 인스턴스

클래스로부터 객체를 만드는 과정을 클래스의 인스턴스화 라고 하며, 어떤 클래스로부터 만들어진 객체를 그 클래스의 인스턴스 라고한다.

2.3 객체의 구성요소 - 속성과 기능

객체

속성과 기능으로 이루어짐 객체가 가진 속성과 기능을 그 객체의 멤버라 한다.

클래스는 객체를 정의한것 → 객체의 모든 속성과 기능이 클래스에 정의되어있음

속성(property) ⇒ 멤버변수, 특성, 필드, 상태 기능(fuction) ⇒ 메서드, 함수, 행위

인스턴스는 참조변수를 통해서만 다룰 수 있으며, 참조변수의 타입은 인스턴스의 타입과 일치해야한다.

2.4 인스턴스의 생성과 사용

클래스명 번수명 = new 클래스명();

TV t1 =new TV(); //TV클래스의 인스턴스 t1과 t2생성

2.5 클래스의 또 다른 정의

프로그래밍적 관점에서 클래스

  1. 클래스-데이터와 함수의결합

데이터 저장형태의 발전과정

변수 ⇒ 배열 ⇒ 구조체 ⇒ 클래스

변수: 하나의 데이터를 저장할 수 있는 공간 배열: 같은종류의 여러 데이터를 하나의 집합으로 저장하는 공간) 구조체: 서로 관련된 데이터를 종류에 관계없이 하나의 집합으로 저장할수 있는 공간 클래스: 데이터와 함수의 결합(구조체 + 함수)

  1. 클래스 - 사용자 정의 타입

프로그래밍 언어에서 제공하는 자료형 외에 프로그래머가 관련된 변수들을 묶어서 하나의 타입으로 새로 추가하는 것을 사용자 정의 타입이라고 한다.

자바와 같은 객체지향언어에서는 클래스가 곧 사용자 정의 타입이다.

3. 변수와 메서드

3.1 선언 위치에 따른 변수의 종류

변수의 종류를 결정짓는 중요한 요소는 ‘변수의 선언된 위치’다.

  • 지역변수 : 멤버변수를 제외한 나머지 변수들
  • 클래스변수 : 멤버변수 중 static이 붙은 변수
  • 인스턴스 변수 : 멤버변수 중 static이 붙지않은 변수

변수 종류 선언위치 생성시기

클래스 변수 클래스 영역 클래스가 메모리에 올라갈 때
인스턴스 변수   인스턴스가 생성되었을 때
지역변수 클래스 영역 이외의 영역 변수 선언문이 수행되었을 떄
  1. 인스턴스 변수
    1. 인스턴스는 독립적인 저장공간을 가지기때문에 서로 다른값을 가질 수 있다.
    2. 인스턴스마다 고유한 상태를 유지해야하는 속성의 경우 사용
  2. 클래스 변수
    1. 모든 인스턴스가 공통된 저장공간을 공유한다. ⇒ 항상 공통된 값
    2. 한 클래스의 모든 인스턴스들이 공통적인 값을 유지해야함
    3. 인스턴스를 생성하지 않고도 바로 사용가능
    4. public을 붙이면 전역변수의 성격을 갖는다.
  3. 지역변수
    1. 메서드 내에서만 사용가능

3.2 메서드

메서드는 특정 작업을 수행하는 일련의 문장들을 하나로 묶은 것이다.

메서드 사용이유

  • 높은 재사용성
  • 중복된 코드 제거
  • 프로그램의 구조화

3.3 메서드 선언과 구현

-선언부 , 구현부

메서드 선언부

반환타입(출력) 메서드이름 매개변수 선언(입력)

int add (int x, int y) {    // 선언부
	int result = x + y;
                            // 구현부
	return result;
}

3.4 return문

원래 반환값의 유무에 관계없이 모든 메서드에는 적어도 하나의 return문이 있어야한다. 반환타입이 void일 때에는 컴파일러가 메서드의 마지막에 return을 자동적으로 추가해주기 때문에 생략이 가능하다.

3.5 JVM의 메모리 구조

JVM은 할당받은 메모리를 용도에 따라 영역을 나누어 관리한다. 그 중 3가지 주요영역 method area, heap, call stack 영역이 있다.

  • method area
    • 어떤 클래스가 사용되면 JVM은 해당클래스의 클래스 파일을 분석하여 클래스에 대한 정보를 이곳에 저장한다.
    • 클래스변수가 생성되는 공간
  • heap
    • 인스턴스가 생성되는 공간
    • 인스턴스변수들이 생성되는 공간
  • 호출스택 (call stack or execution stack)
    • 메서드 작업에 필요한 메모리 공간을 제공한다.
    • 메서드가 작업을 마치면 할당되었던 메모리공간은 반환되어 비워진다.
    • 아래에 있는 메서드가 바로 위의 메서드를 호출한 메서드이다.

첫 번째로 호출된 메서들를 위한 작업공간은 호출스택의 맨 밑에 마련된다. 메서드 수행 중 다른 메서드를 호출하면 바로위에 공간이 마련되고 첫번째 메서드는 수행을 멈추고 두번째 메서드가 수행되기 시작한다.

호출 스택의 제일 상위에 위치하는 메서드가 현재 실행중인 메서드이고, 나머지는 대기상태이다.

3.6 기본형 매개변수와 참조형 매개변수

기본형 매개변수 : read only 참조형 매개변수 : read & write

매개변수의 타입이 기본형일 때는 기본형 값이 복사되겠지만, 참조형이면 인스턴스의 주소가 복사된다.

반환타입이 참조형이라는 것은 메서드가 객체의 주소를 반환한다는것을 의미한다.

3.7 재귀호출(recursive call)

메서드 내부에서 메서드 자신을 다시 호출하는 것을 ‘재귀호출’이라 하고, 재귀호출을 하는 메서드를 ‘재귀메서드’라 한다.

호출된 메서드는 ‘갑에 의한 호출’을 통해, 원래의 값이 아닌 복사된 값으로 작업하기 때문에 호출한 메서드와 관계없이 독립적인 작업수행이 가능하다.

코드에 오로지 재귀호출뿐이면, 무한히 자기자신을 호출하기 때문에 재귀호출은 조건문이 필수적으로 따라다닌다.

왜 굳이 반복문대신 재귀호출을 사용할까? ⇒ 재귀호출이 주는 논리적 간결함 때문이다.

먼저 반복문으로 작성해보고 너무 복잡하면 재귀호출로 간단히 할 수 없는지 생각해보자. 재귀호출은 비효율적이므로 재귀호출에 드는 비용보다 간결함이 주는 이득이 큰 경우에만 사용해야한다.

3.8 클래스 메서드 와 인스턴스 메서드

클래스 메서드

  • 객체를 생성하지 않고 호출이 가능하다.

인스턴스 메서드 - 반드시 객체를 생성해야 호출이 가능하다.

어느 경우에 static을 사용해서 클래스 메서드로 정의해야하는걸까? ⇒ 인스턴스 메서드는 인스턴스변수를 필요로 하는 메서드이다. 반면에 메서드 중에서 인스턴스와 관계없는 메서드를 클래스 메서드로 정의한다. 물론 인스턴스 변수를 사용하지 않는다고 반드시 클래스 메서드로 정의해야하는것은 아니지만 특별한 이유가 없는 한 그렇게 하는것이 일반적이다.

  1. 클래스를 설계할 때, 멤버변수 중 모든 인스턴스에 공통으로 사용하는 것에 static을 붙인다.
  2. 클래스 변수는 인스턴스를 생성하지 않아도 사용할 수 있다.
  3. 클래스 메서드는 인스턴스 변수를 사용할 수 없다.
    • 인스턴스 변수나 메서드에서는 static이 붙은 멤버를 사용하는 것이 언제나 가능하다. 인스턴스 변수가 존재한다는 것은 static변수가 이미 메모리에 존재한다는것을 의미하기 때문이다.
  4. 메서드 내에서 인스턴스 변수를 사용하지 않는다면, static을 붙이는 것을 고려한다.
    • static을 붙인 메서드는 호출시간이 짧아져 성능이 향상됨

3.9 클래스 멤버와 인스턴스 멤버간의 참조와 호출

같은 클래스에 속한 멤버들 간에는 별도의 인스턴스를 생성하지않고 서로 참조 또는 호출이 가능. 단, 클래스 멤버가 인스턴스 멤버를 호출하고자 하는 경우엔 인스턴스를 생성해야한다.

 

why? 인스턴스 멤버가 존재하는 시점에 클래스 멤버는 항상 존재하지만, 클래스 멤버가 존재하는 시점에는 인스턴스멤버가 존재하지 않을 수도 있기 때문이다.

 

인스턴스 메서드 static 메서드 
다른 인스턴스 메서드 호출 ⭕️ 인스턴스 메서드 호출 ❌ 
static 메서드 호출 ⭕️ static 메서드 호출 ⭕️
인스턴스 변수 사용 ⭕️ 인스턴스 변수 사용❌
static 변수 사용 ⭕️ static 변수 사용 ⭕️