JAVA) JAVA 그게 뭔데... 어떻게하는건데 ...

백준우·2022년 12월 26일
0

Java & Spring

목록 보기
1/6
post-thumbnail
post-custom-banner

객체 구조화 프로그래밍

1. 객체구조화 프로그래밍이란?

  1. OOP의 장,단점
  2. OOP의 5원칙과 특징

들어가면서

  • 평소 Node와 Django로 웹을 개발하던중 JAVA의 객체 기반언어에 흥미를 느끼고 많은 회사들이 JAVA를 왜 쓰는것인지에 대해 의문을가지면서 학습을 시작한다.
    정확히 말하자면, 이미 JAVA를 활용한 Spring으로 프로젝트는 2번정도 경험을 하였지만 회고형식의 블로깅이 없으니 아무래도 수박 겉핥기 방식으로 간다는 느낌과 개발과함께 실력이 오르는게 아닌 그때그때 발생하는 문제와 업무만 쳐내는 코더가 되는듯한 기분이들어 성장하는 개발을 위해
    JAVA를 밑바닥부터 다시 공부하고 기록하면서 시작하려고 한다.

JAVA의 기초 OOP의 개념

  • JAVA에 들어가면서 OOP에 대해 흔히들어봤다. Object Oriented Programing으로 객체지향 프로그래밍이라고 이해하면되겠다.
    OOP는 객체, 클래스를 크게 나눌수 있겠는데 먼저 객체는 말그대로 사람이나 물체를 지칭하는 뜻이다. baek이라는 사람을 하나의 객체라고 생각하면 되겠다. 그리고 클래스는 객체가 가지고 있는 특징이나 상속이라고 생각하면 되겠다. 예시로 baek의 눈,코,입등을 그사람의 클래스라고 생각하면 되겠다.

  • 플라스틱과 같은 물건을 만들땐 보통 틀을 만들고 그 틀에 플라스틱 액을 넣어 틀에맞게 굳히면 하나의 제품이 된다. 이때 틀을 객체라고 생각하면되고 이 틀을 이용해서 찍어내는걸 클래스라고 표현하면 되겠다.

  • 그렇다면 이러한 부분을 어떻게 코딩으로 나타내는냐? 큰 결과물을 잘게 쪼개어 완성하는것이 아니라 작은 문제들을 하나씩 만들어 조합해 객체를 만들고 큰 결과물을 만들어 나가는것이다.

표1) OOP - JAVA

OOPJAVA
객체클래스
상태멤버 변수
동작메소드

1. (OOP)객체구조화 프로그래밍이란?

OOP의 장,단점

  • 이러한 OOP 장점과 단점을 크게 가지는데 객체지향 프로그램과 대조적인 절차지향 프로그램으로 대조를 해서 나타내보도록 하겠다.
객체지향절차지향
코드 재사용성이 뛰어나다코드 재사용성이 좋지 않다
개발기간이 길게 잡힌다빠른 개발속도를 가진다.
개발 난이도가 복잡하고 높다상대적으로 개발난이도가 낮다
대형프로젝트에 적합하다중소규모 프로젝트에 적합하다
유지보수성이 높다유지보수성이 낮다

위의 표는 100% 정답이 아닐수 있다. 왜냐하면 년차에 따라 절차지향도 충분히 재사용성이 좋고 유지보수성을 높게 설계할 수 있을것이다. 하지만 사회적으로 흔히 나타내는 특징은 다음고 같다고 위와 같다고 할 수 있다.

OOP의 5원칙과 특징

  • OOP의 5원칙
    그렇다면 OOP의 특징을 살펴보기전 5원칙에 대해 살펴보겠다. OOP를 설계 및 활용하기전에 이 5원칙을 매우 잘 고려하고 밑바탕으로 깔아두고 가야할 필요성이 있다.
  1. S (SRP : Single Responsibility Principle) : 한 클래스는 하나의 책임만 가져야 한다.
  2. O (OCP : Open/Closed Principle) : 확장에는 열려있으나, 변경에는 닫혀 있다.
  3. L (LSP : Liskov’s Substitution Principle) : 프로그램의 객체는 프로그램의 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야 한다.
  4. I (ISP : Interface Segregation Principle) : 특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나보다 낫다.
  5. D (DIP : Dependency Inversion Principle) : 추상화에 의존한다. 구체화에 의존하면 안된다.

위 5가지를 합쳐 OOP의 5원칙은 SOLID로 생각하며 되겠다. 특히 저는 제일 처음에 나오는 S규칙이 생각보다 절차지향에서 객체지향으로 넘어가는 입장에서 적용하기 어려웠던 부분이다.

OOP의 특징 4가지

  1. 캡슐화
  • 데이터와 코드의 형태를 외부로부터 알 수 없게 하고, 데이터의 구조와 역할, 기능을 하나의 캡슐 형태로 만드는 방법

    캡슐화란?

    • 데이터와 코드의 형태를 외부로부터 알수 없도록 하는것이고 데이터의 구조와 역할 기능을 하나의 캡슐록 압축되도록 설계하는것이다.
    • 이를위해 Spring에서 Getter,Setter을 많이 사용했다. Or 접근제어자에 private를 붙여 캡슐화를 시킬 수도 있다.
    public class Company() {
    	private String companyName;  //private를 붙이면 Company클래스에서만 접근이 가능하다.
    }
  1. 상속
  • 클래스들의 공통적인 특성(변수, 메소드)들을 묶어 표현하는 것

    상속이란?

    • 상속이란 부모클래스에서 정의된 변수 및 메소드를 자식클래스에서 사용할 수 있는것이다.
    • 부모의 기능을 가지고 와서 자식이 변경을할 수 도있다.
    • 상속을 하면 캡슐화를 좀 더 효과적으로 이룰 수 있도록 한다.(클래스 안에 메서드를 별도의 작업없이 자식이 받아서 사용하는것)
    public class Company() {
    	private String companyName;
    	public void getCompany() {
        	System.out.println("Get Company");
        }
    }
    public class Department() extends Company { // extends를 통해 Company를 부모로 두고 메서드에 접근 할 수 있다.
    	public static void main(String[] args) {
        	Department department1 = new Department();
            department1.Company();
        }
    }
  1. 추상황
  • 부모 클래스에 정의된 변수 및 메서드를 자식 클래스에서 상속받아 사용하는 것
    • 인터페이스로 클래스들의 공통적인 특성(변수, 메서드)들을 묶는것이다.
    • 예시로 도마뱀, 사자, 독수리, 코끼리를 하나의 객체라고 생각했을때 이 객체들을 하나로 묶으려하면 동물이라는 추상적객체로 전체를 묶을수 있고 혹은 포유류등 일부분을 묶을수도 있는데 이를 추상화라고 하는것이다.

    <출처 - https://gmlwjd9405.github.io/2018/07/05/oop-features.html >
  1. 다형성
  • 다양한 형태로 표현이 가능한 구조를 말한다.
    • 메시지에 의해 객체가 연산을 수행하게 될 때, 하나의 메시지에 대해 각 객체가 가지고 있는 고유한 방법으로 응답할 수 있는 능력
    • 다형화 지원방법으론 오버로딩과 오버라이딩을 예시로 들 수 있겠다.
    1. 오버로딩(OverLoading)
      1) 하나의 클래스에서 메소드의 이름이 같지만, 파라메터가 다른 것 (매개변수의 갯수,타입을 다르게 사용)
    public String Company(String country) { 
    	return "삼성전자"; 
    }
    public int Company(String country ,int countryNum) { // 같은 이름이지만 파라미터에 들어가는 갯수와 들어가는값의 타입도 바뀌는 경우
    	return 3;  
    }
    1. 오버라이디(OverRiding)
      1) 부모 클래스로부터 상속받은 메서드 내용을 변경하여 사용하는 것
    public class Company() {
    	private String companyName;  
    	public void getCompany() {
        	System.out.println("Get Company");
        }
    }
    public class Department() extends Company { // extends를 통해 Company를 부모로 두고 메서드에 접근 할 수 있다.
    	@Override
        public void getCompany(){
        	System.out.println("GET Department Company");
        }
    }

마치며 ...

  • 솔직히 내가 너무 기초부터 시작하나 싶은생각이 들긴하지만 분명 이렇게 쌓아놓은 밑바탕은 좀 더 퀄리티 있는 코드를 짤 수 있는 배경이 될것이다.
    그러니 꾸준히 할 예정이며 블로깅을 통한 독학 및 복기는 지속할것이다.
  • 코드를 짜는건 요즘 세상엔 누구나 할 수 있고 배울 수 있다. 하지만 , 그중 몇은 퀄리티 있는 코드를 짤것이며 그중에 본인이 코드의 구동방식과 특징들을 정말 심도있게 짤 수 있는 사람은 몇 없을것이다. 난 후자인 사람이 될것이다.

참고

profile
이게 되네?
post-custom-banner

0개의 댓글