7. Class
구조적 프로그래밍의 단계
- 컴퓨터 소프트웨어의 계획-개발-검사-보수-관리 등을 위한 기술과 그것을 연구하는 SW공학분야에서 구조적 방식의 프로그래밍은 함수 간의 연관성이 높아져 유지보수가 어려워진다는 단점이 발견되었다.
객체지향 프로그래밍
- 하나의 객체는 하나의 역할만 수행하도록 정의하여 객체 간 연관성을 줄여 재사용성 및 유지보수비용을 줄인다.
- 객체 간의 통신으로 연산을 처리하고 객체 간 연관은 없도록 하는 방식.
- Object = 단일 책임 = 단일 역할 = 관련된 다수의 기능 + 관련된 다수의 데이터 = 독립적 실행 단위 = Code + Data
객체지향 패러다임의 원리
- 캡슐화
- 추상화 : 꼭 필요한 근본적인 특성에 집중하여 여타의 부분이나 상세 내역들을 없애 나가는 과정( 함수 내부를 몰라도 실행해 달라고 하면 실행가능한)
- 다형성(같은 이름의(같은 식별자의) method가 있는 경우 매개변수의 개수와 매개변수의 타입 차이가 있다면 다른 기능을 수행할 수 있도록 구현하는 것을 허락함)
함수 = 코드를 묶어서 만든 덩어리 = 함수
배열 = 데이터를 묶어서 만든 덩어리 = 배열
객체 = 함수 + 배열
- 자신의 데이터를 사용해 하나의 역할을 수행할 수 있는 독립된 단위
- 객체지향 방법론의 핵심은 바로 객체이다. 모든 관점을 객체라는 단
위로 바라봐야 한다 - 객체 간의 결합도는 낮도록 만들면 좋은 프로그램이다.
- 객체 안의 속성과 method의 응집도는 높게 만들수록 좋은 프로그램이다.
객체와 클래스의 관계
클래스란 : 객체를 생성하는 데 사용되는 틀
인스턴스 = 실행 가능한(실행된) 객체
클래스 정의
클래스와 인스턴스의 메모리 관계
- 속성의 초기화가 필요함 = 생성자의 역할 = 반드시 public, 주소값을 return 하도록 정해져 있기 때문에 return값을 지정해 주면 안 됨. , 클래스명과 메서드명이 동일해야 한다.
자바의 new
- 일반적인 변수의 경우 {}(brace)가 닫히면 알아서 수거해 가는 stack 메모리 영역제 저장하지만 자바의 new를 사용하여 선언한 경우 heap 메모리에 올려준다.
- heap 메모리는 통짜 메모리로 미리 쪼개져 있는 크기가 아니라 마음대로 쓸 수 있도록 할당함 ← 일정한 크기를 사용할 것이라고 정해져 있는 기본형 데이터와 다르게 사용자 정의에 때라 객체의 크기가 다르기 때문에 (메모리를 얼마나 사용할지 확신할 수 없기 때문에) 통짜 메모리를 줄 수밖에 없다.
- 그래서 new로 메모리를 할당한 경우 메모리 수거하는 과정이 필요하다
- 다만 java는 c보다 쉽게 만들기 위해 여러 기능을 추상화했기 때문에 딥하게 최적화를 하는 개발자에게는 최적화 명령을 내려도 JVM이 하고 싶은 순간에 메모리를 놓아주는 방식이기 때문(그래서 C나 C++ 이 더 딥한 프로그래머에게 좋은 언어임)
- method area는 함수와 같은 코드들이 올라가는 메모리공간이다.(Data공간이 아니라 Code 공간임)
8. 클래스 설계
클래스의 설계
설계도(UML) 구현방식
- 객체 추출
- 객체 모델링(객체 역할을 정의 → 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의 하위 클래스를 다루는 경우
권장하는 클래스 설계
- GUI를 담당하는 MyFrame클래스와 Duck클래스가 분리된 경우
- sub클래스에 의존하는 코드를 구현하지 말고, super 클래스에 의존하는 코드를 작성해야, 변경에 민감하지 않게 작성할 수 있다.
상속은 2가지의 효과를 위해 사용하게 된다.
- 코드의 재사용성(sub클래스 간의 공통코드를 재활용성)
- 부모를 통해 모든 자식을 한꺼번에 제어하는 데 사용한다.
- 이와 같이 부모에 의존하는 코드를 작성하려면(구현하려면) 필요로 하는 문법이 클래스 간의 형변환이라는 기술입니다.
각 자식 클래스별로 제어하는 나쁜 코드
부모로 제어하는 좋은 코드
자바 자료형의 형변환
기본형
- 메모리상의 값 영역에 값 자체가 저장되는 형태
- ex) 8가지(숫자, 문자, 논리)
- 논리형을 제외한 7가지형은 모두 서로 간의 암묵적, 명시적 형변환을 지원
참조형
- 메모리상의 값 영역에 값이 아닌 주소를 다루는 형태
- ex) Class = Custom Type
- 참조형(Class)끼리 형변환이 가능한가? = A aobj = new B(); 가 가능한가?
→ 선언 시 A타입을 선언했지만 실체는 B instance를 생성한 것을 Class의 형변환이라 하는데 이것이 가능한가?
일반적으로 불가능하다 → 클래스 간의 형변환을 지원하지 않는다.
단, 상속관계의 경우는 자식을 한 번에 제어하기 위해 허용한다.
- 다운캐스팅의 경우 cobj.pi는 메모리에 올라가 있으므로 문제없이 수행되지만 cobj.ci는 메모리에 없기 때문에 문제가 발생한다.
- 따라서 다운 캐스팅은 제공하지 않으며, 업캐스팅만 암묵적으로 제공한다
- 업캐스팅 : super(부모) 클래스의 참조변수가 sub(자식) 클래스의 인스턴스를 가리키도록 형을 변환하는 것.
- 업캐스팅이 일어나면 자식에서 확장한 기능은 not visible 상태로 변환되어 부모의 참조변수로 참조할 수 없다. 부모가 가진(물려준) 함수, 변수만 사용가능하다.
- 단, 추상 메서드는 자식에서 재정의하더라도 부모가 부를 수 있습니다. 왜냐하면 super 클래스에서 method body가 선언되어 있지 않기 때문에 자식의 method와 연결해 준다.
- 예외) 단, 다운 캐스팅을 지원하는 경우가 하나 있다. 명시적으로 형변환을 지정하여 다운 캐스팅한다.
Class 요약
Class = Custom Type = 사용자 정의 타입
1) 일반 클래스 정의
- 객체 생성용
- Instance(Object)의 코드를 재활용하기 위해
2) 추상 클래스 (Abstract)
- 정의 : 하나 이상의 추상메서드(원형부만 갖는)를 갖는 클래스
- 구성형태 : 일반 클래스 + 추상 메서드
- 제약조건 : 추상클래스는 new 연산자를 사용해 인스턴스 생성을 할 수 없다.
3) 인터페이스(Interface) 클래스
- 일반적인 인터페이스 = 두 대상 간의 commutication(통신)을 위한 중간 매개체
- Java에서의 인터페이스
- 자바는 다중 상속을 원칙적으로 지원하지 않는다.
- 하지만 인터페이스로 정의한 클래스로부터는 다중 상속을 받을 수 있다.
다중 상속
다중 상속의 장점
- 코드의 재사용 - Java는 이점을 포기함(상속받는 부모 클래스 간의 변수명이 같은 경우 애매모호해진다.)
- 효율적 제어 - Java는 이걸 노림
- 자바는 원칙적으로 다중 상속(extends)을 허락하지 않는다.
- 자바에서 인터페이스 클래스로 선언한 클래스로부터는 다중 상속이 가능한다.
//변수 선안 안된다. - 상수 선언만 가능하다 public static final
//추상메서드만 가능(반드시 재정의가 필요함) public abstract
디자인 패턴이란
- 소프트웨어를 설계할 때 특정 맥락에서 자주 발생하는 고질적인 문제들이 또 발생했을 때 재사용할 수 있는 훌륭한 해결책
GoF 디자인 패턴
- 생성(Creational) 패턴
- 구조 패턴
- 행위 패턴
웹개발에는 MVC패턴이 많이 사용된다.
MVC = Model View Control로 나누어서 3가지로 나누어서 개발하는 게 좋은 디자인 패턴
9. 자바의 자료구조 + 알고리즘
대량의 데이터를 다루는 기술에 대해서 연구한 학문
- 선형 자료구조
- 배열
- 스택/큐
- 연결 리스트
- 비선형 자료구조 - 구현이 조금 더 어려움
- 트리(DB에서 Btree자주 쓰임)
- 정적배열: 크기를 정하면 실행도중에 크기를 변경할 수 없다.
- int [] arr = new int [10];
- 동적배열: 크기를 변경할 수 있어야 할 경우
- Collection Framewordk
- List = 순서 있게 저장하고 관리하는 자료구조(순서중요)
- Set = 순서 없이 저장하고 관리하며 중복을 허용하지 않는 자료구조
- Hash: (Key, Value)로 접근 가능한 자료구조
- 자바의 동적배열인 List는 object 타입만 받기 때문에 기본자료형을 object 타입(자바의 가장 상위 클래스)으로 변경한 후 넣어주어야 한다.
- ArrayList는 새로운 데이터를 추가하기 위해서는 새로운 공간(메모리)에 원래 데이터를 복제한 후 추가할 값을 붙여서 만들어준 후 원래 데이터를 지우는 방식이다.(컴퓨터입장에서 자원소모가 크다는 단점)
- LinkedList는 데이터의 끝부분에 주소값을 들고 있어서 다음 값을 연결해 주는 방식이다.(모든 데이터마다 추가 주소값을 들고 있기 때문에 낭비일 수 있다.) 실행 도중 추가/삭제가 빈번하며 동적배열을 써야 한다면 ArrayList보다 유리하다.
- 결국 컴퓨터 입장에서는 정적배열을 사용하는 것이 시공간적으로 효율적이다.
- Generic = 타입 제한 <>로 사용
'Java' 카테고리의 다른 글
Java GUI (0) | 2023.03.22 |
---|---|
Java Basic (0) | 2023.03.22 |