[객체지향 프로그래밍] 01. 객체지향 프로그래밍 개념 총 정리

객체지향 프로그래밍을 공부하기위해 자바로 실습하면서 공부한것들 총 정리

객체지향 프로그래밍

객체지향 프로그래밍 이란?

프로그램을 수많은 ‘객체’라는 기본 단위로 나누고 이 객체들의 상호작용으로 서술하는 방식이다. 객체란 하나의 역할을 수행하는 ‘메서드와 변수(데이터)’의 묶음으로 봐야 한다.

객체단위로 이루어지기 때문에 대규모 프로젝트에서의 협업, 유지보수성, 확장성이 뛰어나다.

용어 정리

  • 객체 : 객체 지향 프로그램의 대상, 생성된 인스턴스, 메서드와 변수(데이터)의 묶음
  • 클래스 : 객체를 프로그래밍하기 위해 코드로 만든 상태
  • 인스턴스 : 클래스가 메모리에 생성된 상태
  • 멤버 변수 : 클래스의 속성, 특성(데이터)
  • 메서드 : 멤버 변수를 이용하여 클래스의 기능을 구현(함수)
  • 참조 변수 : 메모리에 생성된 인스턴스(주소값을 가지고 있는)를 가리키는 변수
  • 참조 : 생성된 인스턴스의 메모리 주소 값

변수의 유형

객체지향의 4가지 특징

1. 캡슐화

캡슐화는 클래스를 통해 변수와 함수를 하나의 단위로 묶는것을 의미한다.

또한 클래스의 인스턴스를 통해 클래스에 포함된 멤버변수와 메서드에 접근할 수 있고, 이를 원하지 않는 경우 접근제어자를 통해 원하는 범위까지 정보를 은닉할 수 있다.

2. 상속성

부모 클래스의 특성과 기능을 자식 클래스에서 상속받아 사용할 수 있게 해주는 기능이다. 이를 통해 캡슐화를 유지하면서 클래스의 재사용을 용이하게 해준다.

이때 상속받은 기능을 자식 클래스에 맞게 변경하여 사용할 수 있는데 이것을 ‘오버라이딩’이라고 한다.

3. 다형성

하나의 변수 또는 함수가 상황에따라 다른 값을 return할 수 있는 것을 말한다. 이러한 기능을 하기 위해 앞선 개념들이 필요하다.

객체지향 프로그래밍의 유연성, 재활용성, 유지보수성에 기본이 되는 중요한 특징이다.

4. 추상화

추상화의 경우 어떠한 클래스의 공통 자원들의 뼈대만을 나타내어(선언 o, 구현 x) 상속받아 사용하는 개념이다.

자바의 경우 abstract를 사용하여 나타내고, 추상화 클래스가 하나라도 있을경우 인스턴스로 생성할 수 없다.

클래스 내부에 구현한 클래스로 클래스 내부에서만 사용하기위해 선언하는 클래스이다.

헷갈리는 개념들

오버로딩과 오버라이딩

  • 오버로딩

    이름은 같지만 메서드 시그니쳐는 다른 메서드를 다양하게 생성하여 다양하게 사용할 수 있게 해주는 기능

  • 오버라이딩

    상속시 부모 클래스의 이름은 그대로 쓰지만 함수의 기능을 변경하여 사용할 수 있게 해주는 기능

인터페이스와 추상클래스(java 8 기준)

  • 인터페이스

    추상메서드로 이루어진 형태이며, java 8부터는 default를 통해 구현체를 가질 수 있기는 하다. 일반 변수를 가질 수 없고 상수의 개념으로 들어간다. 코드를 사용하는 사람에게 어떠한 기능이 있는지 명세하는 목적을 가진 개념, implements를 사용하고 두 개이상의 인터페이스를 동시에 구현할 수 있다.

  • 추상클래스

    일반메서드와 추상메서드를 가질 수 있으며 공통 자원들의 뼈대만을 나타내어 상속을 위해 존재하는 클래스, extends를 사용하고 하나의 값만 상속받을 수 있다.

인터페이스와 추상클래스를 동시에 사용할 수도 있다.

업케스팅과 다운케스팅 (java)

[부모] Animal - Mammal - Human [자식]

클래스의 상속관계가 위와 같다고 할때 내용은 다음과 같다.

  • 업케스팅

    상위 클래스로의 묵시적 형 변환

      Animal upcast = new Human();
    

    상위클래스의 경우 하위클래스의 타입을 내포하고 있으므로 위와같이 별도의 선언없이 사용할 수 있음.

    형 변환시 상위클래스의 기능은 모두 사용할 수 있지만 하위클래스에서 생성된 특정 기능은 사용할 수 없다.

  • 다운케스팅

    하위 클래스로의 명시적 형 변환

      Animal upcast = new Human();
      Human downcast = (Human)upcast;
    

    하위 클래스로 형 변환시 변환할 클래스를 명시해야 한다.

    이때 원래 선언된 클래스와 다를 경우(위의 경우 (Human)대신 (Dog)의 경우) 에러가 발생할 수 있기 때문에 아래와 같이 ‘instanceof’를 사용해야 한다.

      if (upcast instanceof Dog){
      	Dog downcast = (Dog)upcast;
      }
      else if (upcast instanceof Human){
      	Human downcast = (Human)upcast;
      }
    

Object class

자바에서 모든 클래스들은 Object class를 상속받고 있다. Object class에는 다양한 메서드가 선언되어 있으며 이를 상속받아 그대로 사용할 수도 있고 오버라이딩할 수 도 있다.

제공되는 주요 메서드는 toString(객체를 문자로 표현), equals(객체와 객체가 같은지 비교), clone(객체를 복제) 등이 있다.

제네릭 프로그래밍

데이터 형식에 의존하지 않고, 하나의 값이 여러 다른 데이터 타입들을 가질 수 있는 기술에 중점을 두어 재사용성을 높일 수 있는 프로그래밍 방식

컬렉션 프레임워크

프로그램 구현에 필요한 자료구조와 알고리즘을 구현해 놓은 라이브러리

  • Collection 인터페이스

    하나의 객체를 관리하는데 필요한 메서드가 선언된 인터페이스 (List, Set)

    • List 인터페이스

      순서가 있음, 중복 허용 (ArrayList, Vector, LinkedList)

    • Set 인터페이스

      순서가 없음, 중복 불허 (HashSet, TreeSet)

  • Map 인터페이스

    쌍으로 이루어진 객체를 관리하는데 필요한 메서드가 선언된 인터페이스(Hashtable, HashMap, TreeMap)

    Key-Value 쌍으로 이루어져있고 Key는 중복될 수 없지만 Value는 가능함.

스트림

앞서 설명한 컬렉션의 자료구조들을 편리하게 저장단위로 다룰 수 있게 해주는 역할을 한다.

기존에는 .iterator()를 사용하였지만 JAVA 8부터 .stream()을 제공하여 더 간결하게 구현할 수 있다.

customerStream.stream().map(c -> c.getname()).forEach(a -> System.out.print(a + ","));

위와 같이 ‘.’연산자로 메서드 체이닝을 구현할 수 있다.

이미지 출처 패스트 캠퍼스 강의자료


© 2020. All rights reserved.