일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- MSA
- 백준
- c언어
- 자료구조
- IT
- JPA
- 파이썬
- react
- Algorithm
- 컴퓨터구조
- 알고리즘
- JavaScript
- Java
- Galera Cluster
- 디자인 패턴
- redis
- Spring
- 네트워크
- spring webflux
- Data Structure
- mongoDB
- MySQL
- Heap
- 운영체제
- OS
- Kafka
- 자바
- C
- Proxy
- design pattern
Archives
- Today
- Total
시냅스
[Java] 객체지향(OOP) 관련 용어 정리 본문
- 클래스 (Class)
- 객체의 청사진(Blueprint)
- 상태(클래스, 인스턴스 변수)와 행위(메서드)를 갖는 자바의 기본 단위
- 상속 (Inheritance)
- 상위 클래스의 변수와 메소드에 대한 사용권을 갖는 것
- subclassing : 다른 클래스의 코드를 재사용할 목적으로 상속을 사용하는 경우
- is - a 관계
- 어휘적 정의가 아닌 기대되는 행동에 따라 타입계층의 의미가 달라질 수 있음.
- 슈퍼타입과 서브타입 관계에서는 행동 호환성이 중요
- subtyping : 타입 계층을 구성하기 위해 상속을 사용하는 경우
- 행동 호환성
- 두 타입 사이에 행동이 호환될 경우에만 타입계층으로 묶어야 한다.
- 동일한 메서드를 구현하면 행동을 호환하는것인가?
- 슈퍼클래스 (Super Class)
- 상속되는 클래스, 부모 클래스
- 서브클래스 (Sub Class)
- 상속 받는 클래스, 자식 클래스
- 객체 (Object)
- 객체 지향 프로그래밍의 기본 단위
- 데이터, 변수, 메서드를 모두 포함
- 업 캐스팅
- 부모클래스 자료형에 자식클래스의 인스턴스가 대입
- 다운 캐스팅
- 자식클래스 자료형에 부모클래스의 인스턴스가 대입
- 자식클래스는 부모클래스의 기존 함수보다 추가되는 함수 등 자식클래스의 범위가 더 넓다. 고로 명시적으로 형변환을 해주어야한다.
public class Main {
public static void main(String[] args) {
Shape r = new Rectangle(0, 0, 10, 20);
Circle c = (Circle) new Shape(0, 0, 9, 9);
System.out.println(r.getArea());
System.out.println(c.getArea());
}
}
// 하지만 위의 경우에서 C에서 오류가 발생하는데 역시 범위가 더 넓어, 메소드가 다를수 있기 떄운에 다운캐스팅은 다음과 같이 사용한다.
public class Main {
public static void main(String[] args) {
Shape r = new Rectangle(0, 0, 10, 20);
Shape sc = new Circle(0, 0, 9, 9);
Circle c = (Circle) sc;
System.out.println(r.getArea());
System.out.println(c.getArea());
}
}
- 객체 지향 프로그래밍 (Object-Oriented Programming)
- 객체 (여러 개의 독립된 단위)들의 모임으로 프로그래밍을 파악하고자 하는 것
- 각각의 객체는 메세지를 주고받고, 데이터를 처리할 수 있다. (협력)
- 프로그램을 유연하고 변경이 용이하게 만든다.
- 인스턴스 (Instance)
- 한 클래스의 특정한 객체
- 인스턴스화 (Instantiate)
- 클래스에서 인스턴스를 생성시키는 것
- new 를 사용해 새로운 객체를 생성하는 것
- 생성자와 소멸자
- 생성자는 객체를 초기화하거나 설정하고
- 소멸자는 객체를 삭제하고 정리
- 멤버 (Member)
- 객체 혹은 클래스의 변수나 메서드
- 멤버 변수 (Member Variable)
- 클래스나 객체의 멤버로 클래스 내에서 선언된 멤버 변수
- static(class) 변수와 instance 변수가 있음
- static은 모든 객체가 공통적으로 사용
- instance 변수는 각 객체들마다 따로 생성 되어 개별적으로 사용하는 변수
- 멤버 함수 (Member Function)
- 클래스 내에서 선언된 함수
- 식별자 (Identifier)
- 변수, 함수, 상수, 배열, 클래스, 메서드 등에 부여하는 이름
- 접근 제한자 (Access Modifier)
- public : 모든 접근을 허용
- protected : 같은 패키지에 있는 객체와 상속관계의 객체들만 허용
- default : 같은 패키지에 있는 객체들만 허용
- private : 현재 객체 내에서만 허용
- 추상화 (Abstraction)
- 어떤 대상(객체)을 표현하는 데 있어 일부 특성들만 표현하는 것
- 개별적인 대상들의 공통점을 모아 클래스 또는 인터페이스화 하는 것
- 추상클래스는 객체가 가지는 특성들을 추상화 시켜 놓았을 뿐이므로 구체화가 필요하다. -> 객체를 생성할 수 없다.
- 정보 은닉 (Information hiding)
- 접근할 수 있는 범위를 성정하여 정보를 은닉하는 것
- 캡슐화 (Encapsulation)
- 정보 은닉의 하위 개념 중 하나
- 객체의 필드를 비공개로 하고 필요한 경우에만 메소드 공개를 설정하는 것
- 다형성 (Polymorphism)
- 역할과 구현으로 세상을 구분
- 하나의 객체가 서로 다른 타입과 기능으로 동작할 수 있음을 의미.
- 인터페이스(역할)에서 파생된 클래스들(구현체)의 기능이 각각 다를 수 있음
- 클라이언트는 구현 대상의 내부 구조를 몰라도 된다.
- 클라이언트는 구현 대상의 내부 구조가 변경되어도 영향을 받지 않는다.
- 클라이언트는 구현 대상 자체를 변경해도 영향을 받지 않는다.
import java.util.HashMap;
class PolyShape {
void draw() {} // 자녀클래스에서 상속받아서 사용할 메서드를 정의
}
class PolyLine extends PolyShape {
void draw() { // 부모클래스의 메서드를 자신에게 맞게 재정의
System.out.println("선을 그린다.");
}
}
class PolyCircle extends PolyShape {
void draw() { // 부모클래스의 메서드를 자신에게 맞게 재정의
System.out.println("원을 그린다.");
}
}
class PolyRect extends PolyShape {
void draw() { // 부모클래스의 메서드를 자신에게 맞게 재정의
System.out.println("사각형을 그린다.");
}
}
public class OOPEx11 {
public static void main(String[] args) {
PolyShape[] shape = { new PolyLine() , new PolyCircle() , new PolyRect()};
shape[0].draw(); // 재정의 된 메서드가 구현
// 선을 그린다.
shape[1].draw(); // 재정의 된 메서드가 구현
// 원을 그린다.
shape[2].draw(); // 재정의 된 메서드가 구현
// 사각형을 그린다.
}
}
- 메서드 재정의 (Overrding)
- super class에 있는 메서드와 식별자는 동일하지만 구현이 다른 경우
- 변경
- 메서드 오버로딩 (Overloading)
- super class에 있는 메서드와 식별자는 동일하지만 매개변수를 다르게 하여 추가로 정의한 것
- 추가
- 추상클래스 (Abstract Class)
- 미완성된 설계도
- 객체를 생성할 수 없다.
- 다중 상속 불가
- extends
abstract class Shape {
public abstract void darw();
public void test99() {
System.out.println("일반 메서드");
}
}
class Line extends Shape {
@Override
public void draw() {
System.out.println("Line");
}
}
class Rect extends Shape {
@Override
public void draw() {
System.out.println("Rect");
}
}
- 인터페이스 (Interface)
- 기본적인 설계도
- 상속받은 클래스는 모든 메서드를 오버라이딩 해야 됨.
- 다중 상속(구현) 가능
- implements
interface PhoneInterface {
final int TIMEOUT = 1000;
void sendCall();
void receiveCall();
dafault void printLogo() {
System.out.println("Phone");
}
}
class Calc {
public int calculate(int x, int y)
{
return x + y;
}
}
class SmartPhone extends Calc implements PhoneInterface {
@java.lang.Override
public void sendCall() {
System.out.println("따르릉~!~");
}
@java.lang.Override
public void receiveCall() {
System.out.println("전화왔어요");
}
publc void schedule() {
System.out.println("일정관리합니다.");
}
}
public class InterfaceEx {
public static void main(String[] args){
SmartPhone phone = new SmartPhone();
phone.printLogo();
phone.sendCall();
System.out.println("3과 5를 더하면 " + phone.calculate(3, 5));
phone.schedule();
}
}
디자인 패턴
- 소프트웨어를 설계할 때 특정 맥락에서 자주 발생하는 고질적인 문제들이 또 발생했을 때 재사용할 할 수있는 훌륭한 해결책
- 3가지의 디자인 패턴을 정리하고 각각의 디자인 패턴을 생성(Creational), 구조(Structural), 행위(Behavioral) 3가지로 분류
생성(Creational) 패턴
- 객체 생성에 관련된 패턴
- 객체의 생성과 조합을 캡슐화해 특정 객체가 생성되거나 변경되어도 프로그램 구조에 영향을 크게 받지 않도록 유연성을 제공한다.
- ex) 추상팩토리, 빌더, 팩토리메소드, 프로토타입, 싱글턴
구조(Structural) 패턴
- 클래스나 객체를 조합해 더 큰 구조를 만드는 패턴
- 예를 들어 서로 다른 인터페이스를 지닌 2개의 객체를 묶어 단일 인터페이스를 제공하거나 객체들을 서로 묶어 새로운 기능을 제공하는 패턴이다.
- ex) 어댑터, 브리지, 컴퍼지트, 데커레이터, 퍼사드, 플라이웨이트, 프록시
행위(Behavioral)
- 객체나 클래스 사이의 알고리즘이나 책임 분배에 관련된 패턴
- 한 객체가 혼자 수행할 수 없는 작업을 여러 개의 객체로 어떻게 분배하는지, 또 그렇게 하면서도 객체 사이의 결합도를 최소화하는 것에 중점을 둔다.
- ex) 책임연쇄, 커맨드, 인터프리터, 이터레이터, 미디에이터, 메멘토, 옵서버, 테이트, 스트래티지, 템플릿 메서드, 비지터
'Java, Spring' 카테고리의 다른 글
IOC와 DI, 컨테이너 (0) | 2022.07.25 |
---|---|
좋은 객체 지향 설계의 5가지 원칙 (SOLID) (0) | 2022.07.15 |
[Java] Generic - 와일드 카드 Wildcard (0) | 2022.07.11 |
[JAVA] Equals와 hashcode (0) | 2022.07.11 |
자바 가상 머신, JVM이란 (0) | 2022.07.11 |
Comments