728x90

JPA (Java Persistence API)란?

자바 진영의 ORM 기술 표준

 

ORM?

  • Object-Relational-Mapping(객체 관계 매핑)
  • 객체는 객체대로 설계한다.
  • 관계형 DB는 관계형 DB대로 설계
  •  ORM 프레임워크가 중간에서 매핑( 하나의 값을 다른 값으로 대응시키는 것)

즉, 객체와 관계형 DB를 각각 설계한 후, ORM으로 매핑시킨다.

 

JPA는 애플리케이션과 JDBC(자바에서 데이터베이스에 접속할 수 있도록 하는 자바 API )사이에서 동작한다.

 


1. SQL을 직접 다룰 때 발생하는 문제점

1.1 반복 작업

더보기

SQL을 직접 다룰 때의 문제점을 보기 위한 기능 예시

 

public class Member
{
    private String memberId;
    private String name;
    
}

회원 객체

public class MemberManager
{
    public Member find(String memberId){
    
    // 1
    
    String sql = "SELECT MEMBER_ID, NAME FROME MEMBER M WHERE MEMBER_ID = ?";
    
    
    // 2
    
    Statement stmt;
    ResultSet res = stmt.excuteQuery(sql);
    
    
    // 3
    
    String memberId = res.getString("MEMBER_ID");
    String name = res. getString("NAME");
    
    Member member = new Member();
    member.setMemberId(memberId);
    member.setName(name);
    
    return member;
    
    }
}

회원 관리를 위한 Manager.

find(String memberId)로 회원을 조회한다.

  1. sql문 작성
  2.  sql문 실행
  3. 조회 결과를 Member객체로 매핑

회원 추가, 수정, 삭제 또한 SQL을 작성하고, JDBC API를 사용하는 비슷한 일을 반복할 것이다.

 

만약, 회원 객체를 데이터베이스가 아닌 자바 컬렉션에 보관한다면 다음 한 줄로 저장할 수 있다.

list.add(member);

하지만 데이터베이스는 객체 구조와는 다른 데이터 중심의 구조이다.

때문에 데이터베이스에 직접 저장하거나 조회할 수는 없다.

 

즉, 개발자가 객체지향 애플리케이션과 데이터베이스 중간에서 SQL과 JDBC API를 코드로 작성해야 한다.

 

결국 하나의 애플리케이션에는 수많은 DB 테이블이 있을 것이다.

그러면 이런 비슷한 일을 더 많이 반복해야 한다.

 

1.2 SQL에 의존적

더보기

앞에서 만든 회원 객체를 관리하는 MemberManager를 완성하였다.

그런데 갑자기 회원의 연락처도 함께 저장해달라는 요구가 들어왔다.

 

public class Member
{
    private String memberId;
    private String name;
    private String tel; // 추가
    
}

이렇게 되면 조회, 추가, 수정, 삭제의 코드 전체가 변동될 수 있다.

왜냐하면 매핑을 할 데이터가 늘어났으니까.

 

Member처럼 비즈니스 요구사항을 모델링한 객체를 엔티티라고 한다.

지금처럼 SQL에 모든것을 의존하는 상황에서는 개발자들이 Manager을 열어서 어떤 SQL이 실행되고 어떤 객체들이 함께 조회되는지 일일이 확인해야 한다.

 

즉,

  • 진정한 의미의 계층 분할이 어렵다.
  • 엔티티를 신뢰할 수 없다.
  • SQL에 의존적인 개발을 피하기 어렵다.

 

1.3 JPA와 문제 해결

더보기

간단히 JPA가 문제를 해결하는 법을 알아보자.

JPA를 사용하면 객체를 DB에 저장하고 관리할 때, 개발자가 직접 SQL을 작성하는 것이 아니다.

JPA가 제공하는 API를 사용하면 개발자 대신 적절한 SQL문을 생성해서 DB에 전달한다.

 

jpa.persist(member); // 저장

persist() 메소드는 객체를 데이터베이스에 저장한다.

이 메서드를 호출하면 JPA가 객체와 매핑정보를 보고 적절한 INSERT SQL을 생성해서 DB에 전달한다.

 

String memberId = "helloId";
Member member = jpa.find(Member.class, memberId); // 조회

find() 메소드는 객체 하나를 데이터베이스에서 조회한다.

이 메서드를 호출하면 JPA가 객체와 매핑정보를 보고 적절한 SELECT SQL을 생성해서 DB에 전달한다.

그 결과로 Member 객체를 생성해서 반환한다.

 

수정기능과 연관된 객체를 조회하는 기능은 나중에 설명하겠다.

 

 


2. 패러다임의 불일치

애플리케이션은 전부터 점점 발전해나가면서 그 내부의 복잡성도 점점 커지고 있다.

지속 가능한 애플리케이션을 개발하기 위해선, 유지보수가 중요하다.

객체지향 프로그래밍은 추상화, 캡슐화, 상속, 다형성 등의 특성이 있다.

그 덕분에 현대의 복잡한 애플리케이션은 대부분 객체지향 언어로 개발된다.

 

엔티티들로 객체를 모델링하면 객체지향 언어가 가진 장점을 활용할 수 있다.

하지만 이 모델링한 엔티티를 저장할 때 문제가 생길 수 있다.

 

문제

더보기
class Dog
{
    String name;
    public void move(){}
}

Dog라는 클래스의 객체를 저장해야 하는 상황이 있다.

이때는 해당 객체 의 필드만을 저장하면 나중에 DB에 접근해서 처리를 해야할 때 문제없이 이용할 수 있다.

 

하지만

만약 이 객체가 부모 객체를 상속받았다면?

만약 이 객체가 다른 객체를 참조하고 있다면?

이런 경우는 객체의 상태를 저장하기 쉽지 않다.

 

예를 들어 회원 객체를 저장할 때 팀 객체를 참조하고 있다면?

회원 객체를 저장할 때 팀 객체도 함께 저장해야 한다.

 

단순히 회원 객체만 저장하면 참조하는 팀 객체를 잃어버릴 수 있다.

 

 

객체와 관계형 데이터베이스는 지향하는 목적이 서로 다르다.

이것을 객체와 관계형 데이터베이스의 패러다임 일치 문제라고 한다.

 

이러한 불일치를 개발자가 중간에서 직접 해결해야 한다. 

이를 해결하는 시간에 너무 많은 시간과 코드를 소비하게 된다.


3. JPA로 ORM알아보기

더보기

ORM은 객체와 관계형 DB를 매핑한다고 했었다.

그리고 ORM 프레임워크는 패러다임 불일치 문제를 개발자 대신 해결해준다.

 

예를 들어 ORM 프레임워크를 사용하면 객체를 DB에 저장할 때 : 

개발자는 INSERT SQL을 직접 작성하지 않는다.

객체를 마치 자바 컬렉션에 저장하듯이 ORM 프레임워크에 저장하면 된다.

그러면 ORM 프레임워크가 적절한 INSERT SQL을 생성해서 DB에 저장해준다.

 

개발자는 그냥 매핑 방법만 ORM 프레임워크에게 알려주기만 하면 된다.


4. JPA 정리

더보기

1. 생산성

JPA를 사용하면 다음 코드처럼 자바 컬렉션에 객체를 저장하듯이 JPA에게 저장할 객체를 전달한다.

jpa.persist(member); // 저장
Member member = jpa.find(memberId) // 조회

따라서 지루하고 반복적인 CRUD용 SQL을 개발자가 직접 작성하지 않아도 된다.

 

2. 유지보수

SQL을 직접 다루게 되면 엔티티에 필드를 하나만 추가해도 SQL결과를 매핑하기 위한 JDBC API코드를 모두 변경해야 했다.

하지만 JPA를 사용함으로써 대신 SQL을 작성하기 때문에 필드를 추가하거나 삭제해도 수정해야 할 코드가 줄어든다.

 

3. 패러다임의 불일치 해결

객체와 관계형 데이터베이스는 지향하는 목적이 서로 다르다.

이것을 객체와 관계형 데이터베이스의 패러다임 일치 문제라고 한다.

JPA는 상속, 연관관계, 객체 그래프 탐색, 비교하기와 같은 패러다임의 불일치 문제를 해결해준다.

 

728x90
728x90

01. 웹을 구성하는 요소

프로그래밍이란?

  • 컴퓨터와 소통하는 법
  • 컴퓨터에게 전달하는 정보를 어떻게 보여주고 제어할지 결정
  • 웹 개발을 하기 위한 언어로 브라우저와 소통

출처 : 위키백과

  

 

HTML

정보 / 설계도

 

 

 

 

 

 

 

CSS

디자인 / 스타일링

 

 

 

 

 

 

 

JS

기능과 효과

 

 

 

 

웹사이트 제작 시 고려사항

  • 웹 표준 : 웹사이트를 작성할 때 따라야 하는 공식 표준이나 기술 규격
  • 웹 접근성 : 장애의 여부와 상관 없이 모두가 웹사이트를 이용할 수 있게 하는 방식
  • 크로스 브라우징 : 모든 브라우저 또는 기기에서 사이트가 제대로 작동하게 하는 기법

02. HTML 주요 태그 살펴보기

HTML란?

웹사이트에서 눈에 보이는 정보나 특정 구역을 설정할 때 사용하는 언어이다.

 

HTML 태그 구성요소

<열린태그 속성 = "속성 값"> 컨텐츠 </닫힌태그>

  • 태그명 : HTML이 갖고있는 고유의 기능, <열린태그></닫힌태그>형태로 입력
  • 컨텐츠 : 열린태그와 닫힌태그 사이에 있는 내용물
  • 속성 : HTML이 갖고 있는 추가 정보
  • 속성 값 : 어떤 역할을 수행할 지 구체적인 명령 진행

태그 종류

  • <!DOCTYPE html> : html5 문서 선언
  • <html></html> :  문서의 시작과 끝을 나타냄
  • <head></head> : 웹사이트의 요약 정보이다. 웹사이트에 노출되지 않는다.
  • <body></body> : 눈에 보이는 정보이다. 이미지나 텍스트로 웹사이트에 노출된다.
  • <meta charset="UTF-8"> : 모든 문자를 깨짐없이 표시
  • <title></title> : 웹사이트 제목

 

  • <img scr = "logo.png" alt = "로고 이미지" width="??" height = "??"> 태그 : 정보성을 가지고 있는 이미지를 삽입. 닫힌 태그는 없다.
    • src 속성 : 이미지의 경로를 나타낸다.
    • alt 속성 : 이미지가 뜨지 않은 경우 나타난다.
    • width 속성 : 이미지의 너비를 표현
    • height 속성 : 이미지의 높이를 표현
  • <h> 태그 : 제목/부제목을 표현한다.
    • 숫자 값이 커질 수록 폰트가 작아짐 => 숫자는 중요도를 나타냄
    • <h1>태그는 제일 중요한 정보. 하나의 html문서에서 하나만 사용됨.
  • <p> 태그 : 본문 내용을 표현한다.
    • 웹사이트의 중요 정보를 담는 태그
    • 나타내고자 하는 내용을 <열린태그><닫힌태그> 사이에 입력
  • <ul> 태그 : 순서가 없는 리스트
    • 메뉴 버튼을 만들 때 사용.
    • 지금 사용되는 동그란 점이다.
  • <a href="??링크" target="??"> 링크 </a> 태그 : 링크 입력 태그
    • href : 링크 주소
    • target : 창 표시 방법
      • _blank : 새 창에 표시
      • _self : 현재 창에 표시
    • "링크"라는 텍스트를 클릭 시 링크로 이동한다.
    • 만약 태그 사이에 <img>태그가 있다면, 이미지를 눌러서 링크로 이동이 가능하다.
     

 

가운데 Google이미지를 클릭하면

구글 기본 페이지로 이동하게 된다.

<a href="구글 주소" target="_self>
    <img src="구글이미지가 있는 경로" alt="구글로고">
</a>

 

 

 


03. 공간을 만들 때 사용하는 태그

04. HTML의 두가지 성격

05. CSS 주요 속성 살펴보기

 

728x90
728x90

java.base모듈은 모든 모듈이 의존하는 가장 기본적인 모듈이다.

 

java.base모듈의 패키지

Java의 기본적인 클래스들이 위치해 있다.

가장 많이 사용되는 패키지 : java.lang

 

Object 

모든 Java클래스들의 조상 클래스이다.

필드가 없고, 메서드로만 이루어져 있다.

  • toString()
    • Class 인스턴스를 토대로 문자열을 만들어 리턴한다.
    • 인스턴스의 모든 정보를 담도록 하는것이 좋다.
class CloneObj implements Cloneable
{
	...
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

public static void main(String[] args)
{
    CloneObj clone1 = new CloneObj();
    
    CloneObj clone2 = clone1.clone();
}
  • clone()
    • 내부의 필드값을 복사하여 새로운 인스턴스를 생성하고 반환한다.
    • 이 메서드를 사용하기 위해선 클래스 선언 시에 Cloneable이라는 인터페이스를 준수하게 해야한다.
public boolean equals(Object obj)
{
	return this == obj;
}
  • equals(Object)
    • 단순히 인스턴스의 주소값을 비교한다.
  • hashCode()
    • 객체를 식별할 수 있는 하나의 정수를 리턴한다.
만약 equals()메서드를 통해 두 객체가 동등하다고 판단된 경우, 두 객체의 hashCode()메서드의 반환값은 같아야 한다.
따라서 이 두 메서드는 함께 사용되어야 하며, 일관성 있고 올바른 동등성 및 해시 처리를 위해 상호 작용해야 한다.
만약 equals()메서드를 오버라이드 한다면, hashCode()메서드도 오버라이드를 하여 일관성을 유지해야 한다.

String 

Java에서 문자열을 다루기 위한 class

불변(Immutable)의 속성을 가진다.

String str = "Hello my name is daehee"

str.equals("Hello my name is daehee"); // true
str.length(); // 23
str.indexOf("Hello"); // 0
str.indexOf("good"); //없으므르 -1 반환
str.toUpperCase(); // HELLO MY NAME IS DAEHEE
str.toLowerCase(); // hello my name is daehee
str.isEmpty(); // false;
str.contains("good"); // false

 

  • length()
    • 문자열의 길이를 반환한다.
  • indexOf(String) 
    • 문자열에서 String 문자열 매개변수의 인덱스를 반환한다.
    • 없으면 -1을 반환한다.
  • toUpperCase()
    • 문자열을 대문자로 바꿔서 반환한다.
  • toLowerCase()
    • 문자열을 소문자로 바꿔서 반환한다.
  • isEmpty()
    • 문자열이 비어있으면 true를 반환한다.
    • 아니면 false를 반환한다.
  • contains(String)
    • 문자열 안에 String 매개변수가 있는지 확인한다.

+ 로 문자열과 문자열을 합칠 수 있다.


 

Math

Wrapper

Enum

등등

728x90

'JAVA' 카테고리의 다른 글

백준 알고리즘 17255  (0) 2024.03.29
JAVA TIL - 03 JVM  (0) 2024.03.12
JAVA TIL - 02 abstract 추상 메서드/클래스  (0) 2024.03.12
JAVA TIL - 01 다형성  (0) 2024.03.12
728x90

01. 공학의 진화

 

출처 :&nbsp;https://www.visualcapitalist.com/the-history-of-innovation-cycles/

공학 > 감성공학 > 창의공학 > 메타공학

  1. 경작
  2. 기계·전기공학
  3. 화학공학
  4. 전자공학
  5. 컴퓨터·정보통신 공학 : 감성공학(ET)
  6. ICT 융합·생명공학 : 창의공학 수요
  7. 창의공학·메타공학

 

(출처 : https://www.visualcapitalist.com/the-history-of-innovation-cycles/)

출처 :https://blog.naver.com/sigmagil/221436375631


02. 의사결정론

 

 

판단은 시각적 판단과 추상적 판단으로 나뉜다.

시각적 판단

  • 감정/감성의 비중이 높다. 
  • 본능적 의사결정의 원인이 된다.

추상적 판단

  • 논리적 근거를 바탕으로 판단한다.
  • 이성적 의사결정의 원인이 된다.

의사결정을 해야하는 순간

  • 본능적 의사결정 : 감정/감성 비중이 높다. 
  • 이성적 의사결정 : 논리적 근거에 비중이 높다.

공학에서의 의사결정

  • 공학적 해석 : 이성적의사결정에종속 => 문제해결
  • 제품/서비스 : 본능적의사결정에종속=> 감성자극

 

창의공학설계 의사결정

  • 이성적의사결정+ 본능적의사결정
  • 공학해석(기술) + 제품/서비스(감성) => 가치사슬연결
  • 기술은 제품/서비스에 종속, 그러나 거래수단으로 진화 미흡 => "모순" 해결필요

 

 

 

 

 

 

 

 

 

 

 


03. 문제 해결 과정

 

절차적(Procedure) 문제해결

절차적 문제해결은 인문학적 문제해결 과정이라고 표현할 수 있다.

일상에서 이루어지는 보편적인 문제해결 과정이다.

문제 정의 어떤 사건에 대해서 문제를 정의한다.
문제 해결 목적 정의된 문제해결 목적을 작성한다.
문제 해결 적용 범위 문제해결을 위한 범위를 한정한다.
문제 해결 수단/방법 문제해결 수단과 방법을 나열한다.
문제 해결  제시된 수단과 방법으로 문제를 해결한다.
실증 활용 최적의 문제해결 수단/방법을 적용한다.

 

 

 

 

 

 

문제 정의 서울에서 미국까지 소포를 전달하고 싶다.
문제 해결 목적 최대한 빠르게 미국에 전달하고 싶다.
문제 해결 적용 범위 운송 수단을 통해 전달한다.
문제 해결 수단/방법 비행기, 배
문제 해결  비행기나 배를 이용하여 소포를 전달한다.
실증 활용 비행기가 더 빠르기 때문에 비행기를 이용한다.

 

 

공학(Engineering) 문제해결

공학 문제해결은 어떤 지식을 이용하여, 문제해결 과정에서 일정한 규칙을 찾고,

정량화로 재구현이 가능하도록 구현하고 검증하는 과정이다.

지식(이해) 지식을 배경으로 문제를 정의한다.
수요(동기) 정의된 문제해결 강한 요구를 작성한다.
대상 한정 수요 대상을 한정한다.
공학 공학적 문제해결 수단과 방법을 제시한다.
구현 제시된 수단과 방법으로 구현한다.
검증 구현된 결과를 검증한다.

 

 

 

 

 

 

지식(이해) api설계에 대한 규칙 동기화 필요
수요(동기) 유저에 대한 정보를 나타내는 경로 규칙 필요
대상 한정 프론트엔드와 백엔드 간의 안전한 협업
공학 약속된 api를 활용하고, 설계한다.
구현 RESTful API를 활용하고,
유저 정보 경로는 "users/{id}"로 설정한다.
검증 설정한 규칙으로 경로 설정 및 각종 명령어와
"users/{id}"를 활용한 기능이 잘 작동하는지 검증.

 

인지/사고 문제해결

주의집중, 기억, 추리, 상상, 예상하기, 계획하기, 의사결정 등 논리적 사고를 기반으로 한다.

728x90
728x90

01. 창의공학설계의 정의

  • 창의
    • 유연성, 유창성, 독창성, 정교성을 포함한다.
    • 새로운 것을 생각해내는 능동적 사고 특성
  • 공학
    • 기술적 문제를 발견하여 기술적 해결책 제시
    • 산업이론, 기술, 생산따위를 체계적으로 연구하는 학문
  • 설계
    • 자원을 활용하여 어떤 것을 만들기 위한 방법이나 계획

즉, 기술과 제품/서비스의 유기적 관계에서 Value Chain을 엮는 것이다.


02. 창의공학설계의 목적

  • 절대적 가치
    • 문제를 해결하는 것, 기술
  • 상대적 가치
    • 수요/공급 조건에 따라 달라지는 것, 제품/서비스

즉, “기술“과 “제품/서비스”가 이상적 가치(Value)를 가지도록 가치사슬(Value Chain)을 설계하는 것


03. 창의공학설계의 범위

  • 전제 1 : 공학은 제품/서비스를 구현하는 수단
    • 공학은 기술 개발 자체가 목적이 아님
  • 전제 2 : 설계는 환경 Demand(수요)에 따라서, 상대적
    • Demand 1 : 기능을 요구하는 설계
    • Demand 2 : 성능을 요구하는 설계
    • Demand 3 : 경제적 비용을 요구하는 설계
  • 전제 3 : 창의는 Demand를 충족시키는 수단/방법

문제 해결 과정

 

문제 해결 과정

공학은 기술 개발 자체가 목적이 아님

장점

  • 직면한 문제해결이나 정성/토론/강화학습에 적합

 

단점

  • 변수가 많고, 문제가 복잡하게 얽혀있는 것에 취약함

 

 

 

 

 

 

 

 

공학 해결 과정

응용과학(=공학) 측면에서 문제해결 방법 제시

장점

  • 직면한 문제 해결이 산업 분야별로 상세 분류되고 전문화 됨

단점

  • 고도화 된 산업의 이슈로 단일 공학으로 산업의 문제 해결 요구에 한계 발생

 

 

 

 

 

 

 

 

인지/사고 해결 과정

인지/감성 공학 측면에서 문제해결 방법 제시

장점

  • 직면한 문제 해결이 논리적 사고 처리에 전문화됨

단점

  • 인공지능(AI)가 지속적으로 발전하고 있지만, Pattern Matching 대비 Intelligence 인공지능(AI) 한계 발생

 

 

 

 

 

 

 

 

미래 예측 BM 창출 과정

시나리오 기법을 이용한 비즈니스 모델(BM) 추출

장점

  • 변화의 동인으로 이슈(문제)를 나열하고, 문제 해결 과정에서 우수한 비즈니스 모델을 도출함

단점

  • 비즈니스 모델 도출 대비, 핵심 권리를 확보하기 위한 공학적 해석 한계 발생

 

 

 

 

 

 

 

창의공학설계 BM 창출 과정

반복된 발산과 수렴을 통한, 창의적 Idea 도출

장점

  • 변화에 빠르게 대응하며, 혁신적인 Idea 기반의 비즈니스 모델 확보

단점

  • 고도화된 산업의 이슈를 기존의 전문화된 공학으로 산업의 문제해결 요구 충족에 한계발생

 

 

 

 

 

 

 

 

즉,
"창의공학설계"는 강한 BM(Business Model)을 확보에 활용할 수 있다.
"창의공학설계"는 기술/제품/서비스를 구현하는 과정에 있다.
강한 BM은 제품/서비스 이해를 기반한 "창의공학설계"가 필요하다.

04. 창의공학설계의 수단/방법

수단/방법

  • 자원 : 문제해결에 요구되는 모든 요소
    • 내부자원 : 시간에 따라 기회비용 유발
    • 외부자원 : 문제해결에 참여 가능한 요소
  • 수단 : 문제해결을 위한 도구(Tools)
    • 하드웨어 : 물리/화학/기계/전기 특성을 이용한 도구
    • 소프트웨어 : 하드웨어 사용의 논리적 순서를 결정하는 도구
  • 설계 : 절차(Process)적인 문제해결
    • 수단을 이용하기 위한 절차적 문제 해결방법
    • 소프트웨어에 적용이 가능한 방법

05. 창의공학설계의 활용

 

출처 : https://www.etnews.com/201301040379

산업/업태/업종 분류

품목 분류

기술 분류

 

 

 

 

 

728x90
728x90

원래는 static 키워드를 먼저 정리하려 했는데...

코드가 어떻게 돌아가는지는 알아야하니까..!

 

자바는 OS에 종속적이지 않다.

윈도우든, 맥이든, 리눅스든 운영체제에 구애받지 않는다.

 

그것을 가능하게 만들어 주는 것이 JVM이다.

JVM은 자바의 코드가 운영체제 위에서 돌아갈 수 있도록 바이트 코드 -> 기계어로 변환해주는 가상머신이다.

자바의 실행 과정

 

JVM의 구성요소

 

출처 : https://url.kr/nijx6q

클래스 로더

클래스를 처음 참조할 때 여러개의 클래스를 묶어서 한번에 메모리에 올린다!(링킹 + 로딩)

 

실행 엔진

작성한 코드가 운영체제에서 실행이 될 수 있도록 바이트 코드를 기계가 실행할 수 있는 형태로 변경한다!

  • 가비지 컬렉터
    • 동적으로 생성된 인스턴스들을 관리한다!
    • 더이상 사용되지 않는 인스턴스를 찾아 메모리에서 삭제한다!

런타임 데이터 공간

프로그램을 수행하기 위해 운영체제에게서 할당받은 메모리 공간!

JVM 스택 영역 메서드가 호출될 때 할당됨
Heap 영역 객체 생성 시 할당됨
Method Area 클래스 로더에서
클래스/인터페이스,
static 키워드 등이 저장됨

 

728x90

'JAVA' 카테고리의 다른 글

백준 알고리즘 17255  (0) 2024.03.29
JAVA TIL - 04 Java.base 모듈 - java.lang  (0) 2024.03.15
JAVA TIL - 02 abstract 추상 메서드/클래스  (0) 2024.03.12
JAVA TIL - 01 다형성  (0) 2024.03.12
728x90

추상 메서드, 클래스는 왜 쓰는 것일까?

 

예제 먼저 보자.

package polymorphism;

class Animal {
    private String name;

    public Animal(String name) {
        this.name = name;
    }

    void bark() // 일반 오버라이딩
    {
        System.out.println("동물!동물!");
    } 
}

 

    package polymorphism;

    public class Dog extends Animal{
        public Dog(String name) {
            super(name);
        }

        @Override
        void bark() {
            System.out.println("왈왈");
        }
    }

 

과연 Animal의 bark메서드의 내용을 작성해야할까?

어차피 하위 클래스인 Dog에서 오버라이딩을 진행할 것이다.

그렇다면 bark 메서드를 써야한다고 명시 정도만 해주는 것은 어떨까?

 

그 개념이 바로 추상 메서드, abstract 키워드가 필요한 순간이다.

 

package polymorphism;

abstract class Animal {
    private String name;

    public Animal(String name) {
        this.name = name;
    }

    abstract void bark(); // 추상 메서드
}

상위 클래스에서 추상 메서드는 선언만 한다.

어차피 하위 클래스에서 오버라이딩 할거니까.

 

추상 메서드를 선언할 때엔 앞에 abstract 키워드를 꼭 넣어야 한다.

또한 클래스 선언할 때에도 추가해야 한다.

 

bark 메서드를 오버라이딩 하지 않으면 오류가 생김으로써 프로그래머가 더욱 안전하게 코드를 짤 수 있도록 도와준다!

 

 

또한 추상클래스 타입으로 인스턴스화는 불가하다.

728x90

'JAVA' 카테고리의 다른 글

백준 알고리즘 17255  (0) 2024.03.29
JAVA TIL - 04 Java.base 모듈 - java.lang  (0) 2024.03.15
JAVA TIL - 03 JVM  (0) 2024.03.12
JAVA TIL - 01 다형성  (0) 2024.03.12
728x90

오늘은 객체지향의 다형성 개념을 알아보았다.

 

다형성이 무엇일까?

구글에서는

다형성(polymorphism)이란? 다형성(polymorphism)이란 하나의 객체가 여러 가지 타입을 가질 수 있는 것을 의미합니다. 자바에서는 이러한 다형성을 부모 클래스 타입의 참조 변수로 자식 클래스 타입의 인스턴스를 참조할 수 있도록 하여 구현하고 있습니다.

라고 정의하고 있다.

 

막상 다형성이라는 개념을 알아보니 잘 이해가 되지 않았다.

 

이 클래스 다이어그램을 보면 

상위 클래스 Animal을 상속 받는 하위 클래스 dog, cat, monkey가 있다.

 

dog 클래스는 Animal의 필드와 메서드를 그대로 갖고 있다.

그럼 과연 dog는 Animal이라고 할 수 있을까?

 

그렇다

이는 일상생활에서 찾아봐도 나오는 답이다.

개는 동물이다. 

하지만 동물이라고 개가 될 수는 없다.

동물이 개만 있는게 아니라 고양이가 될 수도, 원숭이가 될 수도 있기 때문이다.

 

그러면 위 구글이 정의한 다형성과 비교 및 정리 해보자

 

개는 개와 동물이라는 두가지의 타입을 갖을 수 있다. 또한 개를 동물이라고 부를 수도 있다. 

 

 

왜 다형성이 필요할까?

다형성은 "코드의 재사용성"이라는 장점을 가지고 있다.

위의 코드를 다형성 없이 작성한다면 dog, cat, monkey라는 클래스를 작성할 때 중복된 내용똑같이 작성해야 한다.

 

만약 중복된 내용이 엄청 많고, 그와중에 오류가 난다면? 머리 아프다.

하지만 중복된 내용을 하나의 클래스(Animal)로 정리함으로써 코드의 작성 시간간결함이 엄청나게 해소될 것이다.

 

또한 동물이라는 인스턴스를 모두 가져와야하는 상황이라면? 끔찍하다.

dog... cat... monkey... 정의된 동물 클래스만큼의 타입을 싸그리 모아서 가져와야 한다.

이 또한 중복된 내용으로 정리된 하나의 클래스(Animal)로써 정리될 수 있다. 

왜? 개도 동물이고, 고양이도 동물이고, 원숭이도 동물이니까. Animal의 타입만을 가져와도 된다.

 

 

코드로 정리해보자

- Animal class

package polymorphism;

abstract class Animal {
    private String name;

    public Animal(String name) {
        this.name = name;
    }

    abstract void bark(); // 추상 메서드
}

 

 

 

- Dog class

    package polymorphism;

    public class Dog extends Animal{
        public Dog(String name) {
            super(name);
        }

        @Override
        void bark() {
            System.out.println("왈왈");
        }
    }

- Cat class

package polymorphism;

public class Cat extends Animal{
    public Cat(String name) {
        super(name);
    }

    @Override
    void bark() {
        System.out.println("냐옹");
    }
}

- Monkey class

package polymorphism;

public class Monkey extends Animal{
    public Monkey(String name) {
        super(name);
    }

    @Override
    void bark() {
        System.out.println("우끼끼");
    }
}
728x90

'JAVA' 카테고리의 다른 글

백준 알고리즘 17255  (0) 2024.03.29
JAVA TIL - 04 Java.base 모듈 - java.lang  (0) 2024.03.15
JAVA TIL - 03 JVM  (0) 2024.03.12
JAVA TIL - 02 abstract 추상 메서드/클래스  (0) 2024.03.12

+ Recent posts