728x90

Abstract Class

  • 추상클래스(Abstract Class)는 하나 이상의 추상 메소드를 포함하는 클래스이다.
  • 추상 메소드란 선언부만 작성하고 구현부는 작성하지 않은 채로 남겨 둔 것.
  • 추상메소드는 추상클래스를 상속 받은 서브 클래스에서 구현된다.
  • JAVA에서 추상클래스와 추상메소드를 선언하기 위해서는 접근제어자 뒤에 abstract를 붙인다.
  • 클래스를 abstract로 지정하면 new를 통해 객체를 직접 생성할 수 없다.
  • 메소드에 abstrat를 사용하면 interface의 메소드와 같이 구현 부분은 없다.
  • abstract로 선언한 메소드를 자식클래스에서 반드시 구현해야 한다.(오버라이딩)

 

Interface

  • 인터페이스(Interface)는 추상메소드로만 구성되어 있다.
  • 추상클래스와 마찬가지로 인터페이스에서 선언된 추상메소드는 서브클래스에서 구현.
  • JAVA에서 예약어로 class 대신 interface를 사용하며 extends 대신 implement로 서브클래스에서 상속 받는다.
  • 모든 멤버 변수는 public static final 이어야 하며, 생략할 수 있다.
  • 모든 메소드는 public abtract 이어야 하며, 생략할 수 있다.

public static final 사용 목적

인터페이스 변수는 아무 인스턴스도 존재하지 않는 시점이기에 스스로 초기화 될 권한이 없다.

public static final을 사용해 구현 객체의 같은 상태를 보장한다.

 

Interface vs Abstract

공통점

  • New 연산자로 인스턴스 생성 불가능
  • 프로토타입만 있는 메소드를 갖는다
  • 사용하기 위해서는 하위클래스에서 확장/구현해야 한다

차이점

  • 사용하는 키워드가 다르다
  • Abstrat는 일반 메소드를 사용할 수 있지만, Interface는 메소드 선언만 가능하다

 

 

728x90
728x90

기본형(Primitive type)

  • 실제 연산에 사용되는 것은 모두 기본형 변수.
  • 기본형 변수는 4가지 타입 8개로 나눌 수 있다.
    • 정수형 타입 : byte(1byte), short(2byte), int(4byte), long(8byte)
    • 실수형 타입 : float(4byte), double(8byte)
    • 문자형 타입 : char(2byte)
    • 논리형 타입 : boolean(1byte)

 

기본형(primitive type) 특징

  • 기본형 변수는 산술 연산이 가능하다.
  • null로 초기화 할 수 없다.

 

참조형(Reference type)

  • 어떠한 값이 저장되어 있는 주소를 값으로 가진다.
  • 기본형 8가지를 제외한 나머지 모든 타입
  • 참조형 타입의 범주를 크게 나누어 보면
    • 배열 타입(array type)
    • 열거 타입(enum type)
    • 클래스 타입(class type)
    • 인터페이스 타입(interface type)
// EX)
Integer number = new Integer(1);
Date today = new Date();

 

참조형(Reference type) 특징

  • 참조형 변수는 산술 연산 불가
  • null로 초기화 할 수 있다.
  • DB와 연동시 DTO 객채에 null이 필요한 경우 사용 할 수 있다.

 

기본형과 참조형 차이점

  • 기본형 변수는 Stack에 실제 값을 저장하여 사용하며, 참조형 변수는 객체를 저장하는 것처럼 Heap에 실제 값을 저장하고 해당 주소를 Stack에 저장하는 방식
  • 기본형 변수는 실제 값만 가져오는 것이기에 읽기만 가능하다.
  • 참조형 변수는 값을 읽고 변경할 수 있다.

 

728x90
728x90

프로세스(Process)

  • 실행중인 프로그램을 의미 (a program in execution)
  • 프로그램을 실행하면 OS로부터 실행에 필요한 자원(메모리)를 할당받아 프로세스가 된다.
  • 프로세스는 자원과 쓰레드로 구성된다.
  • 모든 프로세스는 최소 1개이상의 쓰레드가 존재한다.
  • 각 프로세스는 별도의 주소 공간에서 실행되며, 한 프로세스는 다른 프로세스의 변수나 자료구저에 접근이 불가능.

 

쓰레드(Thread)

  • 프로세스 내에서 실행되는 여러 흐름의 단위.
  • 프로세스의 자원을 이용해 실제로 작업을 수행하는 것.
  • 쓰레드는 프로세스 내에서 각각 stack만 따로 할당받고 Code,Data,Heap영역은 공유한다..
  • 한 번 종료된 쓰레드는 다시 실행할 수 없다.
  • 모든 쓰레드는 독립적인 작업을 수행하기 위한 자신만의 호출스택을 필요로 한다.
  • JAVA에는 프로세스가 존재하지 않고 쓰레드만 존재
  • JAVA에서는 운영체제의 역할을 JVM이 한다.
싱글쓰레드 = 자원(메모리) + 쓰레드
멀티쓰레드 = 자원(메모리) + 쓰레드 + 쓰레드 + ...

 

멀티 프로세스

  • 하나의 응용프로그램을 여러개의 프로세스로 구성하여 각 프로세스가 하나의 작업을 처리하게 한다.
  • 여러 자식 프로세스 중 하나에 문제가 발생하면 해당 자식 프로세스만 죽고 다른 영향이 확산되지 않는다.
  • 각각 독립된 메모리 영역을 가지고 있어 작업량이 많을 수록 오버헤드가 발생.
  • Context Swiching으로 인한 성능 저하.

 

멀티 쓰레드

  • 하나의 프로세스을 여러개의 쓰레드로 구성하고 각 쓰레드로 하여금 하나의 작업을 처리하게 한다.
  • 프로세스를 생성하여 자원을 할당하는 시스템 콜이 줄어들어 자원을 효율적으로 관리할 수 있다.
  • 쓰레드 간 데이터를 주고 받는 것이 간단해지고 시스템 자원 소모가 줄어든다.
  • 쓰레드는 프로세스 내의 stack을 제외한 모든 메모리를 공유하기 때문에 통신의 부담이 적다.
  • 하나의 쓰레드가 데이터 공간을 망가뜨리면 모든 쓰레드가 작동 불능 상태가 된다.
  • 대표적 멀테쓰레드 응용프로그램은 웹 서버이다.
728x90
728x90

OOP란

OOP(Object-Oriented Programming)이란 객체 지향 프로그래밍.

 

OOP 특성 4가지

  • 캡슐화
  • 추상화
  • 다형성
  • 상속성

위 특징을 이용해 코드의 재사용성을 증가시키고 유지보수를 쉽게 하기 위해 객체지향적 프로그래밍을 한다.

 

캡슐화(Encapsulation)

  • 객체의 필드와 메소드를 하나로 묶고, 실제 구현 내용을 외부에 감춘다.
  • 외부 객체는 제공하는 필드와 메소드만 이용할 수 있다.
  • 캡슐화는 외부의 잘못된 사용으로 인해 객체가 침해 당하지 않게 한다.
  • 노출을 위해 접근 제한자(Access Modifier)를 사용한다.

 

추상화(Abstraction)

  • 목적과 관련 없는 부분을 제외해서 필요한 부분을 포착한다.
  • 객체의 공통된 속성들 중 필요한 부분을 포착해서 클래스로 정의한다.
  • 구체적인 사물들의 공통적인 특징을 파악해서 이를 하나의 개념으로 다룬다.

 

다형성(Polymorphism)

  • 하나의 객체가 여러 가지 타입을 가질 수 있는 것을 의미한다.
  • 오버라이딩과 오버로딩의 현태로 자주 활용된다.

오버라이딩 - 부모클래스에 메소드와 같은 이름으로 사용되며, 매개변수를 재정의하여 함수를 활용하는 것

오버로딩 - 동일한 이름의 함수명을 여러개로 정의하고 매개변수의 타입과 갯수를 다르게하여 매개변수에 따라 다르게 호출 할 수 있게 하는것

 

상속성(Inheritance)

  • 상위(부모) 클래스의 속성(변수)과 기능(메소드)을 재사용하여 하위(자식) 클래스가 전부 물려 받는 것.
  • 물려받는 것 외에 속성과 기능을 추가 할 수 있다.
  • 코드의 재사용성과 유지보수를 위해 사용.

 

 

 

728x90
728x90

Class(클래스)

개념

  • 객체를 정의하고 만들어 내기 위한 설계도 혹은 틀
  • 연관되어 있는 변수와 메소드의 집합

특징

  • 객체의 상태를 나타내는 필드와 객체의 행동을 나타내는 메소드로 구성
  • 필드란 클래스에 포함된 변수
  • 메소드란 어떠한 특정 작업을 수행하기 위한 명령문의 집합

 

Object(객체)

개념

  • 소프트웨어 세계에 구현할 대상
  • 클래스에 선언된 모양 그대로 생성된 실체

특징

  • 클래스의 인스턴스라 부른다
  • 객체는 모든 인스턴스를 대표하는 포괄적인 의미
  • oop 관점에서 클래스의 타입으로 선언되었을 때 객체라고 부른다

※ OOP(Object Oriented Programming) - 객체 지향 프로그래밍

 

Instance(인스턴스)

개념

  • 설계도를 바탕으로 소프트웨어 세계에 구현된 구체적인 실체
  • 객체를 소프트웨어에 실체화 하면 인스턴스라 부른다
  • 실체화된 인스턴스는 메모리에 할당

특징

  • 인스턴스는 객체에 포함된다
  • oop 관점에서 객체가 메모리에 할당되어 실제 사용될 때 인스턴스라 부른다
  • 추상적인 개념과 구체적인 객체사이에 초점을 맞출 경우 사용
  • 인스턴스 용어는 반드시 클래스와 객체 사이의 관계로 한정지어서 사용할 필요는 없다
  • 인스턴스는 어떤 원본(추상적 개념)으로 부터 생성된 복제본을 의미

 

클래스, 객체, 인스턴스 차이점

클래스 vs 객체

  • 클래스는 설계도, 객체는 설계도로 구현한 모든 대상을 의미

객체 vs 인스턴스

  • 클래스의 타입으로 선언되었을 때 객체라 부른다
  • 그 객체가 메모리에 할당되어 사용될 때 인스턴스라 부른다
  • 객체는 현실 세계에 가깝고, 인스턴스는 소프트웨어 세계에 가깝다
  • 객체는 실체, 인스턴스는 관계에 초점되어 있다
728x90
728x90

INDEX

인덱스란 지정한 컬럼들을 기준으로 메모리 영역에 일종의 목차를 생성하는 것.

예를 들어 책 뒷편에 '색인'이 인덱스의 역할과 동일하다.

insert, update, delete의 성능을 희생하고 대신 select(Query)의 성능을 향상시킨다.

단 update, delete의 성능이 느리지만, 인덱스가 있으면 update, delete를 하기 위해 데이터를 조회하는것은 빠르다.

 

INDEX 장단점

INDEX 장점

  • 검색 속도가 빨라질 수 있다. (모든 상황은 아니다.)
  • 쿼리의 부하가 줄어들어 시스템 전체의 성능이 향상 된다.

INDEX 단점

  • INDEX가 데이터베이스 공간을 차지. 약 10%정도의 추가 공간이 필요.
  • 첫 인덱스 생성시 시간이 많이 소요될 수 있다.
  • 데이터 변경 작업이 자주 일어날 경우 오히려 성능이 저하 될 수 있다.

 

효율적인 INDEX

  • WHERE 절에 자주 등장하는 컬럼을 인덱스로 설정
  • ORDER BY 절에 자주 등장하는 컬럼을 인덱스로 설정
  • SELECT 절에 자주 등장하는 컬럼들을 잘 조합해서 인덱스로 설정
  • JOIN이 자주 사용되는 열에 인덱스를 생성하는 것이 좋다.

 

데이터 중복도

  • 중복도가 낮다 - 분포도가 높다 - Cardinality가 높다 - 나타나는 데이터의 종류가 많다.
  • 중복도가 높다 - 분포도가 낮다 - Cardinality가 낮다 - 나타나는 데이터의 종류가 적다.

 

INDEX 사용시 주의점

  • INDEX를 막 생성하면 SELECT는 빨라지지만 INSERT, UPDATE는 느려진다.
  • WHERE절에 사용되어야 INDEX를 주로 사용한다.
  • INDEX를 자주 사용하지 않으면 성능 저하를 초래할 수 있다.  
  • INDEX의 데이터 중복도가 높으면 성능 저하를 초래할 수 있다. 
  • JOIN절에 자주 사용되는 열에는 INDEX의 효율이 좋다.
  • 사용하지 않는 INDEX는 제거하는 것이 효율적이다. 

 

 

 

728x90

'DataBase' 카테고리의 다른 글

[DataBase] RDBMS, NoSQL 차이점  (0) 2022.04.05
[MySQL] Transaction 트랜잭션 정리  (0) 2022.04.04
[MySQL] NOT LIKE  (0) 2022.02.14
[MySQL] 한글 깨짐 현상 해결 방법  (0) 2022.02.13
[MySQL] EXISTS, NOT EXISTS 사용법  (0) 2022.02.04
728x90

접근 제어자

  • 접근제어자는 멤버 또는 클래스를 외부에서 접근하지 못하도록 제한하는 역할
  • 접근제어자는 생략 가능하며 생략했을 때는 자동으로 default를 뜻하게 된다.
  • 접근제어자가 default일 경우 접근제어자를 지정하지 않는다.
  • 접근제어자가 사용될 수 있는 곳 - 클래스, 멤버변수, 메소드, 생성자
    • private - 같은 클래스 내에서만 접근 가능
    • default - 같은 패키지 내에서만 접근 가능
    • protected - 같은 패키지 내에서, 그리고 다른 패키지의 자손 클래스에서 접근 가능
    • public - 접근 제한이 없다.
  • 접근 범위 - private < default < protected < public

 

접근 제어자를 이용한 캡슐화(encapsulation)

  • 접근 제어자를 사용하는 이유는 클래스의 내부에 선언된 데이터를 보호하기 위해.
  • 데이터가 유효한 값을 유지 또는 데이터를 외부에서 함부로 변경하지 못하도록 하기 위해 외부 접근 제한이 필요.
  • 이것을 객체지향 개념에서 캡슐화(encapsulation)이라 한다.

 

728x90
728x90

Overloading

  • overloading은 같은 이름의 메소드를 중복하여 정의하는 것
  • 매개변수의 개수나 타입을 다르게 하면, 하나의 이름으로 메소드를 작성할 수 있다
  • overloading은 서로 다른 시그니처를 갖는 여러 메소드를 같은 이름으로 정의하는 것
  • overloading은 사용되는 이름을 절약할 수 있다
  • 메소드를 호출할 때 전달해야 할 매개변수의 타입이나 개수에 대해 크게 신경 쓰지 않고 호출할 수 있다
  • overloading은 다형성(polymorphism)을 구현하는 방법 중 하나

 

Overloading 조건

  • 메소드의 이름이 같아야 한다.
  • 메소드의 시그치처, 즉 매개변수의 개수 또는 타입이 달라야 한다.

 

Overloading 예제

class Calc {

    static void display(int num1) { System.out.println(num1); }

    static void display(int num1, double num2) { System.out.println(num1 + num2); }

}

public class Test {
    public static void main(String[] args) {

        Calc myCalc = new Calc();

        myCalc.display(10);
        myCalc.display(10, 3.14);

    }
}

// 10
// 13.14
728x90

+ Recent posts