본문 바로가기

컴퓨터공부/JSP

스프링 입문을 위한 자바 객체 지향의 원리와 이해 (3)[책리뷰 & Book review]

by Life & study 2024. 1. 26.
반응형

스프링 입문을 위한 자바 객체 지향의 원리와 이해 (3)

[책리뷰 & Book review]

 

객체와 class의 차이점은 무엇인가에 대한 질문


객체와 class의 차이점은

 

1.'유일 무이한 존재' 인가를 두고 볼 수 있다

2. '실제로 존재하는 것'이라고 할 수 있다.

 

유일 무이한 존재란  =  연월 일련번호를 뜻한다.

실제로 존재하는 것 =  살아있는 존재?

 

자동차

김연하

고양이

가있다면 

 

김연하는 (객체) 로써 유일 '무이한 존재, 실제도 존재하는 것'으로 받아들인다

 

고양이, 자동차는  유일무이한 존재이기보다 클래스라고 한다.


유일무이한 존재는 "객체(Object)"입니다. 클래스는 '공통된 특성'을 가진 객체를 만들기 위한 '틀' 또는 '설계도'이며, 실제로 존재하는 것은 객체입니다.

예를 들어, '사람'이라는 클래스가 있다고 가정해 보겠습니다. '사람' 클래스에는 '이름', '나이', '직업' 등의 필드와 '걷다', '먹다', '자다' 등의 메서드가 정의되어 있을 수 있습니다. 이 '사람' 클래스를 통해 '철수', '영희', '민수' 등의 객체를 생성할 수 있습니다.

java

public class Person {
    // 필드
    String name;
    int age;
    String job;

    // 메소드
    public void walk() {
        System.out.println(name + "이(가) 걷습니다.");
    }

    public void eat() {
        System.out.println(name + "이(가) 먹습니다.");
    }

    public void sleep() {
        System.out.println(name + "이(가) 잡니다.");
    }
}

 

public class Main {
    public static void main(String[] args) {
        // Person 클래스의 객체 생성
        Person person1 = new Person();
        person1.name = "철수";
        person1.age = 25;
        person1.job = "개발자";

        Person person2 = new Person();
        person2.name = "영희";
        person2.age = 23;
        person2.job = "디자이너";

        // 철수와 영희는 각각 독립적인 객체입니다.
        person1.walk();
        person2.eat();
    }
}


위의 코드에서 '철수'와 '영희'는 각각 독립적인 객체입니다. 
'철수'와 '영희'는 같은 '사람' 클래스를 기반으로 생성되었지만, 

각각 다른 '이름', '나이', '직업'을 가지며, '걷다', '먹다', '자다' 등의 행동을 독립적으로 수행할 수 있습니다.

즉, '클래스'는 '공통된 특성'을 가진 '객체'를 만들기 위한 '설계도'이며,

 실제로 존재하고 동작하는 것은 '객체'입니다

'객체'는 각각 독립적인 상태와 행동을 가지며, 이는 '객체'가 유일무이한 존재임을 의미합니다.

 

 

 

 

 

java 가 프로그램세계에 공헌한 것은 무엇인가??

 

 

 

 

 

 

Java는 "Write Once, Run Anywhere"라는 철학을 실현합니다.

 

once [wʌns]
부사
1. 이전에 (한 번), 일찍이(formerly), 한때
a once famous doctor
한때는 유명했던 의사
2. 한 번, 한 차례, 한 곱
once a day발음 듣기
하루에 한 번
접속사
1. 한 번[일단] … 하면, … 하자마자
Oncehe hesitates, we have him.
그가 망설이기만 하면 일은 다 된 거다.
2. 언제 … 하더라도, … 의 때에는 언제라도
명사
1. 한 번, 일 회
Once is enough.
한 번이면 충분하다.
출처: 동아출판 프라임 영한사전
한번[―番]
1.(시험 삼아)
한번 해 보다
try sth out
2.(미래의 어느 때)
언제 한번 들르세요
Please come by sometime.
3.(과거의 어느 때)
한 번은 이런 일도 있었다
Here is something that happened to me once.
출처: ET-house 능률 한영사전


 

"Write Once, Run Anywhere"는 Java의 주요 철학 중 하나로, 한 번 작성한 Java 코드를 어떤 기기에서나 실행할 수 있다는 의미입니다. 이는 JVM(Java Virtual Machine)의 특성 때문에 가능합니다.

Java 컴파일러를 통해 Java 소스 코드는 바이트코드로 컴파일됩니다. 

바이트코드는 특정 하드웨어나 운영체제에 종속되지 않습니다.
java

// HelloWorld.java
public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, World!");
    }
}


의 Java 소스 코드를 컴파일하면 HelloWorld.class라는 바이트 코드 파일이 생성됩니다. 이 작업은 커맨드라인에서 javac HelloWorld.java 명령어를 통해 수행할 수 있습니다.

JVM은 이 바이트코드를 기계어로 변환하고 실행합니다. JVM은 각 운영체제에 맞게 설계되어 있어, 

바이트코드를 해당 운영체제가 이해할 수 있는 기계어로 변환할 수 있습니다. 컴파일된 HelloWorld.class 파일은 JVM을 통해 실행됩니다. 이 작업은 커맨드라인에서 java HelloWorld 명령어를 통해 수행할 수 있습니다.


이처럼, 한 번 작성하고 컴파일된 Java 코드(바이트코드)는 Windows, Linux, MacOS 등 다양한 운영체제에서 JVM을 통해 실행될 수 있습니다. 이는 Java의 "Write Once, Run Anywhere" 철학을 가능하게 하는 주요 메커니즘입니다

 

 

 

 

 

 

 

Java의 객체 지향 프로그래밍(OOP)에는 주로 5가지 원칙

 

Java의 객체 지향 프로그래밍(OOP)에는 주로 5가지 원칙이 있습니다. 이를 SOLID 원칙이라고 하며, 각각 Single Responsibility Principle, Open-Closed Principle, Liskov Substitution Principle, Interface Segregation Principle, Dependency Inversion Principle을 말합니다.

Single Responsibility Principle (SRP, 단일 책임 원칙): 한 클래스는 하나의 책임만 가져야 합니다.
java

// Good: 각 클래스가 하나의 책임을 가짐
class Customer {
    String name;
    // 고객 정보 관련 코드
}

class CustomerDB {
    void Add(Customer customer) {
        // 고객 데이터베이스 추가 관련 코드
    }
}


Open-Closed Principle (OCP, 개방-폐쇄 원칙): 소프트웨어 요소는 확장에는 열려 있어야 하고, 변경에는 닫혀 있어야 합니다.
java

// Good: 새로운 도형을 추가해도 Shape 클래스는 수정할 필요가 없음
abstract class Shape {
    abstract void draw();
}

class Circle extends Shape {
    void draw() {
        // 원 그리기 코드
    }
}

class Square extends Shape {
    void draw() {
        // 사각형 그리기 코드
    }
}


Liskov Substitution Principle (LSP, 리스코프 치환 원칙): 부모 클래스를 자식 클래스로 치환해도 프로그램은 정상적으로 동작해야 합니다.
java

class Bird {
    void fly() {
        // 비행 코드
    }
}

class Duck extends Bird { } // Duck는 Bird를 치환할 수 있음

class Ostrich extends Bird {
    @Override
    void fly() {
        throw new UnsupportedOperationException(); // 이런 경우는 LSP를 위반하는 것
    }
}


Interface Segregation Principle (ISP, 인터페이스 분리 원칙): 클라이언트는 자신이 사용하지 않는 인터페이스에 의존하지 않아야 합니다.
java

// Bad: Printer 클래스는 fax 기능이 필요 없는데도 IFax 인터페이스에 의존하고 있음
interface IMachine {
    void print();
    void fax();
}

class Printer implements IMachine {
    void print() { /* ... */ }
    void fax() { throw new UnsupportedOperationException(); }
}



// Good: 각 기능에 대해 별도의 인터페이스를 제공

interface IPrint {
    void print();
}

interface IFax {
    void fax();
}

class Printer implements IPrint {
    void print() { /* ... */ }
}


Dependency Inversion Principle (DIP, 의존 관계 역전 원칙): 상위 모듈은 하위 모듈에 의존하면 안 되며, 둘 다 추상화에 의존해야 합니다.
java

// Bad: 상위 모듈인 Copy 클래스가 하위 모듈인 Keyboard, Printer 클래스에 의존
class Copy {
    private Keyboard keyboard;
    private Printer printer;
    // ...
}

// Good: Copy, Keyboard, Printer 클래스 모두 IReader, IWriter 인터페이스에 의존
interface IReader {
    void read();
}

interface IWriter {
    void write();
}

class Copy {
    private IReader reader;
    private IWriter writer;
    // ...
}


위와 같이 SOLID 원칙을 따르면 유지 보수가 쉽고, 확장성 있는 코드를 작성할 수 있습니다.



 

 

 

 

 

스프링 삼각형 + 설계정보

POJO,
AOP,
DI,
PSA의 관계 중 JPA
JDBC and ORacle에 대해서

 

스프링 프레임워크는 

POJO(Plain Old Java Object), 

AOP(Aspect-Oriented Programming), 

DI(Dependency Injection),

 PSA(Portable Service Abstraction) 등의 주요 원칙을 기반으로 설계되었습니다.

POJO (Plain Old Java Object): 스프링은 POJO 기반의 프레임워크입니다. POJO는 특정 '규약'에 종속된 클래스가 아닌, 일반적인 Java 클래스를 말합니다. 이를 통해 애플리케이션의 유연성을 높이고, 테스트를 쉽게 할 수 있습니다.

 

AOP (Aspect-Oriented Programming): 스프링은 관점 지향 프로그래밍을 지원합니다. AOP는 횡단 관심사(cross-cutting concerns)를 모듈화 하는 프로그래밍 패러다임입니다. 예를 들어, 로깅, 트랜잭션 관리, 보안 등의 기능을 분리하여 코드의 중복을 줄이고 유지보수성을 높입니다.

 

DI (Dependency Injection): 스프링은 의존성 주입을 통해 객체 간의 의존성을 관리합니다. 의존성 주입은 객체를 직접 생성하는 것이 아니라 외부에서 생성된 것을 사용하는 방법을 말합니다. 이를 통해 코드의 결합도를 낮추고 유연성과 테스트 용이성을 높입니다.

 

PSA (Portable Service Abstraction): 스프링은 PSA를 통해 로우 레벨의 기술에 대한 접근을 추상화합니다. 

이를 통해 개발자는 비즈니스 로직에 집중할 수 있으며, 기술의 변경에 따른 영향을 최소화할 수 있습니다.

 

JPA(Java Persistence API)와 JDBC(Java Database Connectivity)는 데이터베이스에 접근하기 위한 Java의 표준 스펙입니다. JPA는 ORM(Object-Relational Mapping)을 지원하는 표준 스펙으로, 객체 지향적인 코드로 데이터베이스를 다룰 수 있게 해 주며, JDBC는 SQL 질의를 사용하여 데이터베이스에 접근하는 방법을 제공합니다.

스프링 데이터 JPA는 

JPA를 쉽게 사용할 수 있도록 돕는 모듈로, 리포지토리 인터페이스를 통해 CRUD 연산을 쉽게 처리할 수 있습니다. 

스프링 JDBC 템플릿은 JDBC 코드의 중복과 복잡함을 줄여주는 역할을 합니다.

java

// JPA를 사용한 예
@Entity
public class Employee {
    @Id
    @GeneratedValue
    private Long id;
    private String name;
    // ...
}

public interface EmployeeRepository extends JpaRepository<Employee, Long> {
    List<Employee> findByName(String name);
}

// JDBC를 사용한 예
public class EmployeeDao {
    private JdbcTemplate jdbcTemplate;

    public EmployeeDao(DataSource dataSource) {
        this.jdbcTemplate = new JdbcTemplate(dataSource);
    }

    public List<Employee> findByName(String name) {
        return jdbcTemplate.query(
                "SELECT * FROM employees WHERE name = ?",
                new Object[]{name},
                (rs, rowNum) -> new Employee(rs.getLong("id"), rs.getString("name"))
        );
    }
}


위와 같이 스프링 프레임워크는 POJO, AOP, DI, PSA 등의 원칙을 통해 유연하고 테스트 가능한 코드를 작성할 수 있도록 돕습니다. 또한 JPA와 JDBC를 통해 데이터베이스에 쉽게 접근할 수 있게 돕습니다.

 

 

 

 

 

#개발자취업 #개발자기초 #개발자 #개발자분야 #개발자분류 #개발자종류 #it개발자 #서버개발자 #개발자성장 #신입개발자 #ios개발자 #개발자노트북 #개발자 되는 법 #개발 #앱개발 #웹개발 #개발분야 #it개발 #개발공부 #코딩상식 #개발공부 #개발초보

 

#개발자취업 #개발자면접 #개발자채용 #백엔드개발자 #백엔드개발자 #백엔드개발자취업 #백엔드개발 #프런트엔드개발자 #개발자상담 #백엔드 #개발자 #앱개발자 #웹개발자 #개발자팁 #앱개발자 #백엔드취업 #백엔드공부 #백엔드강의 #백엔드독학

 

#전산직면접 #면접 #면접팁 #면접관 #공공기관전산직면접 #공사면접 #면접질문 #면접할 말 #면접준비 #면접준비 #면접답변 #면접질문 #면접기출 #전화면접 #면접복장 #면접답변 #면접꿀팁 #모의면접 #면접후기 #롯데면접 #면접후기 #임원면접 #최종면접 #면접꿀팁

 

 

 

 

 

반응형

댓글