Java

Java의 객체지향

잘잔디 2023. 3. 22. 22:48

7. Class

구조적 프로그래밍의 단계

  • 컴퓨터 소프트웨어의 계획-개발-검사-보수-관리 등을 위한 기술과 그것을 연구하는 SW공학분야에서 구조적 방식의 프로그래밍은 함수 간의 연관성이 높아져 유지보수가 어려워진다는 단점이 발견되었다.

image

객체지향 프로그래밍

  • 하나의 객체는 하나의 역할만 수행하도록 정의하여 객체 간 연관성을 줄여 재사용성 및 유지보수비용을 줄인다.
  • 객체 간의 통신으로 연산을 처리하고 객체 간 연관은 없도록 하는 방식.

imageimage

  • Object = 단일 책임 = 단일 역할 = 관련된 다수의 기능 + 관련된 다수의 데이터 = 독립적 실행 단위 = Code + Data

image

객체지향 패러다임의 원리

  1. 캡슐화
  2. 추상화 : 꼭 필요한 근본적인 특성에 집중하여 여타의 부분이나 상세 내역들을 없애 나가는 과정( 함수 내부를 몰라도 실행해 달라고 하면 실행가능한)
  3. 다형성(같은 이름의(같은 식별자의) method가 있는 경우 매개변수의 개수와 매개변수의 타입 차이가 있다면 다른 기능을 수행할 수 있도록 구현하는 것을 허락함)

함수 = 코드를 묶어서 만든 덩어리 = 함수

배열 = 데이터를 묶어서 만든 덩어리 = 배열

객체 = 함수 + 배열

  • 자신의 데이터를 사용해 하나의 역할을 수행할 수 있는 독립된 단위
  • 객체지향 방법론의 핵심은 바로 객체이다. 모든 관점을 객체라는 단
    위로 바라봐야 한다
  • 객체 간의 결합도는 낮도록 만들면 좋은 프로그램이다.
  • 객체 안의 속성과 method의 응집도는 높게 만들수록 좋은 프로그램이다.

객체와 클래스의 관계

클래스란 : 객체를 생성하는 데 사용되는 틀

image

인스턴스 = 실행 가능한(실행된) 객체

클래스 정의

image

클래스와 인스턴스의 메모리 관계

imageimage

  • 속성의 초기화가 필요함 = 생성자의 역할 = 반드시 public, 주소값을 return 하도록 정해져 있기 때문에 return값을 지정해 주면 안 됨. , 클래스명과 메서드명이 동일해야 한다.

자바의 new

  • 일반적인 변수의 경우 {}(brace)가 닫히면 알아서 수거해 가는 stack 메모리 영역제 저장하지만 자바의 new를 사용하여 선언한 경우 heap 메모리에 올려준다.
  • heap 메모리는 통짜 메모리로 미리 쪼개져 있는 크기가 아니라 마음대로 쓸 수 있도록 할당함 ← 일정한 크기를 사용할 것이라고 정해져 있는 기본형 데이터와 다르게 사용자 정의에 때라 객체의 크기가 다르기 때문에 (메모리를 얼마나 사용할지 확신할 수 없기 때문에) 통짜 메모리를 줄 수밖에 없다.
  • 그래서 new로 메모리를 할당한 경우 메모리 수거하는 과정이 필요하다
  • 다만 java는 c보다 쉽게 만들기 위해 여러 기능을 추상화했기 때문에 딥하게 최적화를 하는 개발자에게는 최적화 명령을 내려도 JVM이 하고 싶은 순간에 메모리를 놓아주는 방식이기 때문(그래서 C나 C++ 이 더 딥한 프로그래머에게 좋은 언어임)
  • method area는 함수와 같은 코드들이 올라가는 메모리공간이다.(Data공간이 아니라 Code 공간임)

8. 클래스 설계

클래스의 설계

image

설계도(UML) 구현방식

  1. 객체 추출
  2. 객체 모델링(객체 역할을 정의 → Class Digram)
  • 유사한 기능을 하는 Class는 같은 부분을 부모 클래스로 만든 후 상속을 통해 재사용성을 높일 수 있다.

@ Override = 부모 클래스의 메서드를 자식 클래스에서 원하는 대로 수정할 수 있음 @ = annotation(컴퓨터도 볼 수 있는 주석)

abstract 클래스는 설계를 위한 목적으로 하위 클래스들이 전부 특정 메서드르 가졌으면 좋겠을 때 abstract타입을 지정할 수 있다.

  • 사람들이 짜둔 라이브러리도 상속할 수 있다.

UML

Unified Modeling Language로 코딩 전 프로그램 설계도 작성 시에 사용하는 툴이다.

Static

  • 변수, 메서드, 클래스 앞에 모두 붙일 수 있다.
  • 모든 자식들이 같은 상수 인수를 가지고 만들어질 경우, 메모리낭비이기 때문에 static으로 class하나에만 상수값을 갖도록 할 수 있다. (= 메모리의 효율적 관리가 가능해진다.)
  • Static을 부여한 변수 또는 함수 또는 클래스는 new로 메모리 할당하지 않더라도 실행 시 static영역에 자동으로 올라간다.

final

  • 변수, 메서드, 클래스 앞에 모두 붙일 수 있다.
  • 본래의 속성을 못하게 만든다는 뜻을 가진다.(변수 앞에 붙이면 변수의 속성(변경가능한 수)을 못하게 만들어 상수로만 사용할 수 있다.
  • public과 함께 사용하여 getter 없이 읽기 전용으로 변수, 메서드, 클래스를 만들 때 사용한다.
  • ex) public static final int DUCK_SIZE = 50;

자바 클래스 간의 형변환

권장하지 않는 클래스 설계 

  • GUI를 담당하는 MyFrame 클래스가 Duck의 하위 클래스를 다루는 경우 

image

권장하는 클래스 설계

  • GUI를 담당하는 MyFrame클래스와 Duck클래스가 분리된 경우

image

  • sub클래스에 의존하는 코드를 구현하지 말고, super 클래스에 의존하는 코드를 작성해야, 변경에 민감하지 않게 작성할 수 있다.

상속은 2가지의 효과를 위해 사용하게 된다.

  1. 코드의 재사용성(sub클래스 간의 공통코드를 재활용성)
  2. 부모를 통해 모든 자식을 한꺼번에 제어하는 데 사용한다.
  • 이와 같이 부모에 의존하는 코드를 작성하려면(구현하려면) 필요로 하는 문법이 클래스 간의 형변환이라는 기술입니다.

각 자식 클래스별로 제어하는 나쁜 코드

image

부모로 제어하는 좋은 코드

image

자바 자료형의 형변환

기본형

  • 메모리상의 값 영역에 값 자체가 저장되는 형태
  • ex) 8가지(숫자, 문자, 논리)
    • 논리형을 제외한 7가지형은 모두 서로 간의 암묵적, 명시적 형변환을 지원

참조형

  • 메모리상의 값 영역에 값이 아닌 주소를 다루는 형태
  • ex) Class = Custom Type
  • image
  • 참조형(Class)끼리 형변환이 가능한가? = A aobj = new B(); 가 가능한가?

→ 선언 시 A타입을 선언했지만 실체는 B instance를 생성한 것을 Class의 형변환이라 하는데 이것이 가능한가?

일반적으로 불가능하다 → 클래스 간의 형변환을 지원하지 않는다.

단, 상속관계의 경우는 자식을 한 번에 제어하기 위해 허용한다.

 

image

  • 다운캐스팅의 경우 cobj.pi는 메모리에 올라가 있으므로 문제없이 수행되지만 cobj.ci는 메모리에 없기 때문에 문제가 발생한다.
  • 따라서 다운 캐스팅은 제공하지 않으며, 업캐스팅만 암묵적으로 제공한다
  • 업캐스팅 : super(부모) 클래스의 참조변수가 sub(자식) 클래스의 인스턴스를 가리키도록 형을 변환하는 것.
  • 업캐스팅이 일어나면 자식에서 확장한 기능은 not visible 상태로 변환되어 부모의 참조변수로 참조할 수 없다. 부모가 가진(물려준) 함수, 변수만 사용가능하다.
  • 단, 추상 메서드는 자식에서 재정의하더라도 부모가 부를 수 있습니다. 왜냐하면 super 클래스에서 method body가 선언되어 있지 않기 때문에 자식의 method와 연결해 준다.
    • 예외) 단, 다운 캐스팅을 지원하는 경우가 하나 있다. 명시적으로 형변환을 지정하여 다운 캐스팅한다.

image

Class 요약

Class = Custom Type = 사용자 정의 타입

1) 일반 클래스 정의

  • 객체 생성용
  • Instance(Object)의 코드를 재활용하기 위해

2) 추상 클래스 (Abstract)

  • 정의 : 하나 이상의 추상메서드(원형부만 갖는)를 갖는 클래스
  • 구성형태 : 일반 클래스 + 추상 메서드
  • 제약조건 : 추상클래스는 new 연산자를 사용해 인스턴스 생성을 할 수 없다.

3) 인터페이스(Interface) 클래스

  • 일반적인 인터페이스 = 두 대상 간의 commutication(통신)을 위한 중간 매개체
  • Java에서의 인터페이스
  • 자바는 다중 상속을 원칙적으로 지원하지 않는다.
  • 하지만 인터페이스로 정의한 클래스로부터는 다중 상속을 받을 수 있다.

다중 상속

다중 상속의 장점

  1. 코드의 재사용 - Java는 이점을 포기함(상속받는 부모 클래스 간의 변수명이 같은 경우 애매모호해진다.)
  2. 효율적 제어 - Java는 이걸 노림
  • 자바는 원칙적으로 다중 상속(extends)을 허락하지 않는다.
  • 자바에서 인터페이스 클래스로 선언한 클래스로부터는 다중 상속이 가능한다.

//변수 선안 안된다. - 상수 선언만 가능하다 public static final
//추상메서드만 가능(반드시 재정의가 필요함) public abstract

디자인 패턴이란

  • 소프트웨어를 설계할 때 특정 맥락에서 자주 발생하는 고질적인 문제들이 또 발생했을 때 재사용할 수 있는 훌륭한 해결책

GoF 디자인 패턴

  1. 생성(Creational) 패턴
  2. 구조 패턴
  3. 행위 패턴

웹개발에는 MVC패턴이 많이 사용된다.

MVC = Model View Control로 나누어서 3가지로 나누어서 개발하는 게 좋은 디자인 패턴

9. 자바의 자료구조 + 알고리즘

대량의 데이터를 다루는 기술에 대해서 연구한 학문

  • 선형 자료구조
    • 배열
    • 스택/큐
    • 연결 리스트
  • 비선형 자료구조 - 구현이 조금 더 어려움
    • 트리(DB에서 Btree자주 쓰임)

  • 정적배열: 크기를 정하면 실행도중에 크기를 변경할 수 없다.
    • int [] arr = new int [10];
  • 동적배열: 크기를 변경할 수 있어야 할 경우
    • Collection Framewordk
    • List = 순서 있게 저장하고 관리하는 자료구조(순서중요)
    • Set = 순서 없이 저장하고 관리하며 중복을 허용하지 않는 자료구조
    • Hash: (Key, Value)로 접근 가능한 자료구조

  • 자바의 동적배열인 List는 object 타입만 받기 때문에 기본자료형을 object 타입(자바의 가장 상위 클래스)으로 변경한 후 넣어주어야 한다.

image

  • ArrayList는 새로운 데이터를 추가하기 위해서는 새로운 공간(메모리)에 원래 데이터를 복제한 후 추가할 값을 붙여서 만들어준 후 원래 데이터를 지우는 방식이다.(컴퓨터입장에서 자원소모가 크다는 단점)

image

  • LinkedList는 데이터의 끝부분에 주소값을 들고 있어서 다음 값을 연결해 주는 방식이다.(모든 데이터마다 추가 주소값을 들고 있기 때문에 낭비일 수 있다.) 실행 도중 추가/삭제가 빈번하며 동적배열을 써야 한다면 ArrayList보다 유리하다.
    image
  • 결국 컴퓨터 입장에서는 정적배열을 사용하는 것이 시공간적으로 효율적이다.
  • Generic = 타입 제한 <>로 사용
    image