Hyokyun Yim bio photo

Hyokyun Yim

Koreatech Computer Science Engineering undergraduate 4 grade.

Facebook Github

객체지향프로그래밍에 대한 기본지식

Overview

객체지향 프로그래밍의 개념

  • 객체지향 프로그램은 현실세계를 프로그램으로 모델링
  • 객체는 행위, 상태, 식별자를 가진다

class 란?

  1. 객체모델링의 수단,현실세계의 개체를 프로그램으로 묘사하기 위해서 필요한 수단
  2. ADT(Abstract Data Type - 추상 데이터 타입), 자바의 기본데이터 타입 : int, double, boolean
  3. 프로그램에서 직접 사용되기도 하지만 instance를 만들기 위한 틀의 역할을 해요!

instance 란?

  • 클래스에서 묘사한 대로 메모리에 공간을 잡는것.(실제 메모리 공간이 있어야 값을 저장하든 쓰든 하기 때문에)
  • 클래스에 기술된 정보를 이용해서 메모리상에 확보된 메모리공간
  • 그럼 class로 부터 어떻게 instance를 생성하나요? -> new라는 키워드로 생성자를 호출하여 instance를 생성한다
  • instance가 생성되려면 반드시 생성자가 호출되어야 해요, 이런 생성자를 호출하는 keyword가 new!!

생성자(constructor) 란?

  • 클래스 이름과 생성자 이름은 같다.
  • 메모리 공간을 확보하고 초기화
  • 자바의 모든 class는 반드시 하나 이상의 생성자를 가진다.(클래스내부에 생성자가 없으면 인스턴스를 못만듬)
  • 프로그래머가 생성자를 안만들어도 javac 컴파일러가 자동으로 기본생성자를 넣어줌.
  • 만약 다른 생성자가 존재한다면 기본 생성자는 넣지 않는다.

캡슐화(Encapsulation)

  • 데이터와 행위를 하나의 단위로 결합
  • 접근제어를 통해 외부에서 불필요한 요소에 대한 접근을 방지함
  • 데이터의 형태를 숨기고, 데이터의 접근을 위한 메소드를 제공하는 과정을 캡슐화라고 한다.
  • 즉 데이터와 행위를 하나로 결합하고, 데이터 표현과 행위의 구현을 사용자로부터 숨기는 것을 캡슐화 라고 한다. -> 사용하는 측에서 데이터를 어떻게 유지하는지, 행위 알고리즘이 어떻게 구현됬는지 알필요가 없다 따라서 재사용이 쉬움
  • private/public 접근제어자를 사용해 정해지지 않은 방법으로 데이터가 조작되는것을 막아준다.

자바의 객체지향

  • 같은 종류의 객체에 대해 같은 메소드가 호출 되더라도 해당 객체의 현재 상태에 따라 결과가 다를수 있다.
  • 자바의 모든 타입은 원시타입/참조타입 으로 이루어 진다.
  • Object 클래스의 존재 -> 항상 최상위에 위치한 클래스가존재한다 이는 범용프로그래밍에 상당히 유용하다.
  • 인터페이스로 유연한 설계가 가능하다.
  • 모든 객체는 동적으로 생성되며, 쓰레기 수집 기능이 있다.

객체 참조변수

  • 참조변수는 스택 영역에 생성되어 힙 메모리 영역의 번지(주소)를 값으로 가진다.
  • 참조 타입의 종류는 : 배열, 열거형, 클래스, 인터페이스, String
  • 원시 타입 종류는 : boolean, char, int, long, float, double ..
  • 참조 타입변수가 null 값을 가질경우, 객체는 힙 영역에 생성되지 않고, 변수만 스택영역에서 생성되 null값을 가짐
  • 특정 객체에 대한 리모컨(참조변수)을 만들면 같은 종류의 객체를 조작 할 수 있다.

Private vs Public

  • private으로 선언하는것은 멤버변수의 현재값을 숨기고자 하는것이 아니라. 변수의 값을 임의로 조작하지 못하도록 하기 위함임 -> 객체가 잘못된 상태로 진입하는걸 방지!, 오류를 줄임

JVM의 메모리구조

  • JVM이 우리 프로그램을 실행하기 위해서 메모리관리를 하는데 총 5가지 영역으로 메모리를 관리하면서 우리 프로그램을 실행시킨다.
  1. Register 영역 : 다음에 수행할 코드의 메모리 위치를 관리 -> JVM이 알아서 관리, 프로그램적으로 이용 불가능
  2. Runcitme constant pool : 상수 -> JVM이 알아서 관리, 프로그램적으로 이용 불가능
  3. Method Area : class 자체에 대한 정보가 들어가는 영역 -> Car라는 클래스가 있어요, 필드 정보는 xxx이구요, 메소드는 xxx이에요 , 클래스가 처음 사용될 때 딱 1번만 올라간다.
  4. Stack Area : 메소드가 호출되면 무조건 영역이 잡힌다., 메소드에서 선언된 변수가 들어가 있다.(지역변수가 위치)
  5. Heap Area : Instance는 Heap 영역에 무조건 들어감

class member vs instance member

  • instance member 란 instance가 생성되어야지 사용할 수 있는 member(field & method)이다. 즉 해당 클래스의 메서드,필드 가 힙에 있어야지 즉 인스턴스가 있어야지 사용이 가능한것.
  • 필드, 메서드에 static이 붙으면 class member 이다.

상속(Inheritance)

  • 클래스를 재 사용하는 가장 쉬운방법 : 상속(inheritance)
  • 상속은 클래스간의 결합도가 상당히 높아질 수 밖에 없는 구조이다. -> 자식클래스를 사용하려면 반드시 부모 클래스가 필요
  • IS-A Relationship(IS-A 관계) : 상속관계에 있는 두 클래스간에 성립하는 관계로 “subclass is a superclass”의 관계를 의미한다.
  • 포유류 - 고래 ( 고래 is a 포유류), 반대(역)는 성립하지 않는다.
  • subclass의 타입을 써야하는 곳에 superclass의 타입을 써도 된다!!

//Super class, Parent class , Upper class
//상위클래스, 부모클래스
class Human
{
	int age;
	public void printInfo()
	{
		
	}
	
}

//Sub class, child class, 자식 클래스, 하위 클래스
class Student extends Human{
	}


//클래스를 재 사용하는 가장 쉬운방법 : 상속(inheritance)
//상속은 클래스간의 결합도가 상당히 높아질 수 밖에 없는 구조이다. -> 자식클래스를 사용하려면 반드시 부모 클래스가 필요
//IS-A Relationship(IS-A 관계) : 상속관계에 있는 두 클래스간에 성립하는 관계로 "subclass is a superclass"의 관계를 의미한다.
//포유류 - 고래  ( 고래 is a 포유류), 반대(역)는 성립하지 않는다.
//subclass의 타입을 써야하는 곳에 superclass의 타입을 써도 된다!!

public class InheritanceTest {

	public static void main(String[] args){
		
		//IS-A 관계라 수행 가능, 하위클래스를 만들떄 상위클래스로 받을수 있다.
		//★즉 여러가지 형태로 인스턴스를 쓸 수 있다. 다형성 이라고도 말한다. -> Student b = new Student(); 도 되고, 	Human c = new Student(); 도 된다.
		Human a = new Human();
		Student b = new Student();
		Human c = new Student();
	}
}

인터페이스(Interface) 개념

  • interface는 interface를 구현하는 클래스가 반드시 제공해야 하는 메소드의 목록을 말함
  • 서로 논리적으로 관계가 없을수도 있지만 동일 메소드를 제공하고 타입들을 하나로 그룹핑 해주는 역할을 한다.
  • ex) Flyable interface -> 곤충과 비행기는 논리적으로 상속관계가 아님(is-a 관계 x)
  • 상속과 달리 interface에는 코드를 정의할 수 없으므로 코드공유 목적으로 사용못함
  • interface는 멤버변수를 가질 수 없으며, 메소드 내용을 정의할 수 없음(추상 메소드만 가짐)
  • interface의 메소드는 자동으로 public abstract 이다.
  • interface에 상수는 정의할 수 있다. -> 상수는 자동으로 public static final
  • interface는 인스턴스 생성 불가
  • abstract class는 추상메소드가 하나라도 존재하는 클래스, interface는 100% 순수한 추상클래스
  • 구현할수 있는 인터페이스에 제한은 없음

인터페이스(Interface) 사용법

  • 인터페이스의 사용법은 아래와 같다

interface Word{
	
	//인터페이스는 추상 메서드를 가지고 있다.
	public void printInfo();
}


//Interface도 IS-A 관계가 성립한다.
class English implements Word{

	//인터페이스를 사용할때는 반드시 추상메서드를 오버라이드 해야한다.
	@Override
	public void printInfo() {
		
		
	}
	
}

  • 그럼 왜 이 인터페이스를 사용하는것일까?
  • 인터페이스 기반으로 프로그래밍을 작성해야 유연하게 구현이 가능하다.
  • 예를들어 DAO interface를 하나 만들고 이를 implements 하여 MySQL용 DAO 1개와, Oracle용 DAO 1개를 만들었다고 하자.
  • IS-A 관계가 성립되므로 Service 쪽에서는 필드에 인터페이스 DAO로 인스턴스를 하나 지정해놓고(ex: private DAO dao;) Controller 단에서 Orale용 DAO 또는 MySQL용 Dao를 service 생성자인자로 넘겨주면 된다. -> Interfcae 기반의 Aggregation 방식 적용
  • 그러면 코드를 많이 바꿀필요없이 느슨한 결합으로 코드 구성이 가능하다.

상송과 인터페이스의 비교

  • 상속은 코드재사용을 가능하게 하지만, 인터페이스는 가능하지 않음. -> 즉 상속은 멤버변수 및 메소드의 공유, 인터페이스는 메소드 이름만 공유(행위만 모델링)
  • 상속은 논리적으로 관련있는 것들을 그룹핑, 인터페이스는 서로 논리적으로 관계가 없어도 그룹핑 가능
  • 공통점 : 여러타입을 동일 리모컨으로 사용할 수 있게 해준다.
  • 주의 : 상속할때 자식클래스에 행위를 추가하지 않는것이 Best -> 부모의 리모컨 버튼수보다, 자식이 더 많으면 안됨.
  • 단 행위의 수는 같지만 안에 기능이 더 추가된건 Best

Interface 안의 default method

  • 자바8부터 interface 안에 기본메소드 정의가 가능하다.
  • 기존에 interface를 변경하면 그것을 구현한 모든 클래스를 무조건 수정해야헀음
  • 기본 메소드를 사용하면 inerface가 변경되도 기존 클래스 수정없이 사용가능 하다.
  • 단 인터페이스의 특성상 인터페이스 기본메소드는 객체의 상태에 접근이 불가능함

다형성

  • 서로 논리적으로 관련 없는것들을 하나의 코드에서 처리가능!
  • ex) void simulate(Flyable f) 라는 메소드에서는 Flyable 인터페이스를 구현한 모든 클래스 타입의 객체를 전달 할 수 있다.
  • Plug-and-Play : 코드 수정없이 호환되는 다른객체 사용 가능
  • 한 타입의 참조변수로 여러타입의 객체를 참조할 수 있도록 하여 다형성을 구현
  • 인터페이스가 상속보다 다형성에 더욱 유연함을 제공
  • 객체 생성은 최하단 자식클래스로 만드는게 좋다.
  • 상위 클래스는 추상클래스로 만드는게 좋다.