목차
< 클래스와 객체 >
1. 클래스
: 객체를 정의해놓은 것으로 객체를 생성할 때 사용한다.
즉 객체의 설계도를 의미한다.
2. 객체
: 객체의 사전적인 정의는 "실제로 존재하는 것"이다.
프로그래밍에서의 객체는 클래스에 정의된 내용처럼
클래스를 데이터 타입으로 메모리에 생성된 것을 의미한다.
- 객체의 구성요소
객체는 속성과 기능, 두 종류의 구성 요소로 이루어져있다.
객체는 다수의 속성, 기능으로 이루어져있어서 속성과 기능의 집합이라고 할 수 있다.
속성 == 멤버변수
기능 == 메서드
< 객체와 인스턴스 >
인스턴스와 객체는 같은 의미이지만 문맥에 따라 사용된다.
책상은 객체다.
책상 클래스의 인스턴스는 책상이다.
인스턴스화
: 클래스로부터 객체를 만드는 과정을 의미한다.
어떤 클래스로부터 만들어진 객체를 그 클래스의 인스턴스라고 한다.
클래스 객체변수 = new 클래스();
new 연산자
new 연산자는 클래스 타입의 인스턴스를 생성해주는 역할을 담당한다.
new 연산자를 통해서 힙영역에 저장할 데이터 공간을 할당받고,
그 공간의 참조값(reference value)을 객체에게 반환해준다.
그리고 생성자를 호출! (=> 클래스() )
< 절차적 지향 언어 대신 객체 지향 언어를 사용하게 된 계기 >
: 초기에는 프로그램의 규모가 크지 않았다.
그래서 개발자들은 기능을 중심으로 코딩을 하였다.
그러나 소프트웨어가 발전하면서
프로그램의 규모가 커지고 복잡해졌고
순차적으로 실행되는
절차적 프로그래밍의 한계가 드러나게 되었다.
동작 순서가 위에서 아래로 순차적으로 이루어지기 때문에
코드간의 결합도가 높았고
한 군데를 고치려면
전체적으로 코드를 손봐야했기 때문에
유지보수가 어렵다는 문제점이 발생하였다.
그래서 이때 나타난 게 객체 지향 프로그래밍이다.
객체 지향 언어와 절차적 지향 언어는 반대 개념이 아니다.
모든 언어는 절차지향적, 객체 지향적으로 코딩을 할 수 있다.
즉 코딩하는 방식의 차이인 것이지
특정 언어는 특정 지향만 지원한다는 의미는 아니다!
< 객체 지향과 절차적 지향 프로그램의 장단점 >
절차적 프로그래밍
: 데이터에 대한 순서 파악 후 필요한 기능을 함수로 만들어 절차적으로 진행시키는 방식
1. 장점
- 컴퓨터의 작업 처리 방식과 유사해서 실행처리 속도가 빠르다 (than 객체지향)
2. 단점
- 전체 프로그램이 유기적으로 연결되어 있어서 유지보수가 어렵다 (결합도 높음)
- 문제가 발생했을 때 모든 코드를 분석해야 하기에 디버깅이 어렵다.
- 동일한 기능을 여러번 사용하려면 동일한 코드를 여러번 작성해야 한다.
3. 특징
- 전체 프로그램이 유기적으로 연결되어 있다.
- 데이터 접근 방식 : Top- Down
>> 작동 방식 : 순차적
객체적 프로그래밍
: 프로그램의 기능들을 묶어서 하나의 객체로 만드는 방식
1. 장점
- 유지보수가 쉽다 (결합도 낮음)
: 수정이 필요한 코드의 해당 구간만 수정하면 된다
- 코드의 재사용성이 높다
(이미 만들어진 클래스를 상속 받는 등
기존의 코드를 이용하여 새로운 코드를 쉽게 작성할 수 있다)
- 디버깅이 쉽다
(특정 구간만 확인하면 되기 때문이다)
2. 단점
- 설계 단계에서 많은 비용과 시간이 소모된다.
(결합도를 낮추는 과정이 필수적이기 때문이다)
- 코드의 실행속도가 느리다 (than 절차적)
: 실행될 코드를 객체에서 호출해와야 하기 때문이다.
3. 특징
- 데이터 접근 방식은 Bottom-Up
< Top - Down과 Bottom-Up의 개념 >
집을 짓는 과정을 예시로 들어서 생각해보자.
Top-Down 방식은 집의 상세 구조도를 먼저 계획한 뒤
이를 바탕으로 뼈대를 만들며 집을 짓는 과정이다.
Bottom-Up 방식은 서재, 안방, 내방과 같이
작은 구성부터 제작을 해나가다가
마지막에 모두를 이어 붙이는 방식이다.
1. Top - Down
: 전체를 분석하고 설계하는데 시간을 많이 들이는 방식
2. Bottom - Up
: 작은 것부터 하나씩 구현해서 전체를 만드는 방식
Java를 객체 지향 언어로
C언어를 절차 지향 언어로 부른다.
객체 지향과 절차 지향을 구분하는 기준은 무엇일까?
기준 1.
캡슐화, 상속,다형성을 지원하는지의 여부
기준 2.
데이터 접근 방식
위 기준을 만족하면 객체 지향 성격이고,
만족하지 않는다면 절차 지향 성격에 가깝다.
< 객체 지향 특징 >
1. 추상화
: 불필요한 부분은 생략하고 필요한 정보만을 중심으로 간소화한다.
ex) 지하철 노선도
2. 캡슐화
: 객체에 필요한 데이터나 기능을 객체에 그룹화시켜주는 과정
3. 상속
: 기존의 클래스를 재사용하여 새로운 클래스를 작성하는 것이다.
(코드의 중복을 막고 재사용성을 높이는 과정)
4. 다형성 (Polymorphism)
: 여러 가지 형태를 가질 수 있는 능력
즉 동일한 조작방법으로 동작을 시키지만 동작 방법이 다른 것을 의미한다.
(노트북 키보드로 문서 작업을 하기도하고, 게임을 할 수 있는 것처럼)
하나의 메소드나 클래스가 있을 때 이것들이 다양한 방법으로 동작하는 것.
객체간 관계를 유연하게 해준다.
> 다형성이 가장 중요하다. 객체지향의 꽃!
> 스프링은 다형성을 극대화해서 이용할 수 있게 도와준다
loC, DI는 다형성을 활용해서 역할과 구현을 편리하게 다룰 수 있도록 지원함.
구현을 편리하게 변경할 수 있도록 스프링이 지원한다. (사용이유)
다형성의 쉬운 예제 : 오버라이딩, 오버로딩
객체 지향 프로그램
: 객체들의 모임
객체는 메세지를 주고 받고 데이터 처리를 한다 (협력)
유연하고 변경이 용이하다.
(컴포넌트를 쉽고 유연하게 변경하면서 개발할 수 있는 방법)
- 인터페이스를 안정적으로 잘 설계하는 것이 중요하다.
< 다형성 >
세상을 역할(인터페이스)과 구현(객체)으로 구분한다.
(그러면 세상이 단순해지고 유연해지고 변경도 편리해진다.)
역할 = 인터페이스
구현 = 인터페이스를 구현한 클래스, 구현 객체
역할과 구현을 분리하면 얻게 되는 이점
- 클라이언트는 대상의 역할(인터페이스)만 알면 된다. 구현 대상의 내부구조를 몰라도 된다.
- 구현 대상의 내부 구조가 변경되어도 클라이언트에겐 아무런 영향이 없다.
- 클라이언트는 구현 대상 자체를 변경해도 영향을 받지 않는다.
- 확장 가능한 설계
한계점
- 인터페이스 자체가 변하면 클라이언트, 서버 모두에 큰 변경이 발생
(EX1)
역할 : 자동차 역할 ...
구현 : K3, 아반테, 테슬라 모델 3 ...
자동차가 바뀌더라도 운전자 입장에서는
차를 운전하는 건 동일하다.
차가 k3에서 아반테로 바뀌어도
면허만 있으면 운전할 수 있다.
클라이언트(역할)에 영향을 주지 않고
새로운 기능(새로운 자동차)을 제공할 수 있다.
객체 설계 시 역할을 먼저 부여하고 그 역할을 수행하는 구현 객체를 만든다.
수 많은 객체 클라이언트와 객체 서버는 서로 협력 관계를 가진다.
클라이언트 : 요청, 서버 : 응답
혼자 있는 객체는 없다.
< 오버라이딩과 오버로딩 >
1. 오버라이딩 (Overriding : 우선시되는)
상위 클래스가 가지고 있는 메서드를 하위 클래스가 재정의하여 사용하는 것이다.
클라이언트를 변경하지 않고, 서버의 구현 기능을 유연하게 변경할 수 있다.
똑같은 이름의 메소드 덮어쓰기, 즉 올라탄다(ride)라고 외우면 될 듯..?
부모와 자식 클래스 사이에서만 성립한다.
(1) 오버 라이딩의 장점
- 부모로부터 받은 메소드의 로직을 변경할 수 있다는 점
(다형성 중 하나에 속하는 특성)
(2) 오버라이딩 조건
- 메서드 이름이 같아야 한다.
- 매개 변수의 개수, 타입, 순서가 같아야 한다.
- 리턴 타입이 같아야 한다.
- 조상보다 더 큰 예외를 던질 수 없다.
- 접근 제한자는 부모보다 범위가 넓거나 같아야한다.
2. 오버로딩 (Overloading : 과적의)
: 같은 이름의 함수를 여러개 정의하고 매개변수의 유형과 개수를 다르게 하여
다양한 유형의 호출에 응답할 수 있게 한다.
즉 함수명은 같으나 전달받는 파라미터의 값에 의해 호출되는 메소드가 다르다는 점!
매개변수는 같으나 반환타입이 다르면 오버로딩이 성립하지 않는다.
- 오버 로딩의 장점
1) 오류 가능성 감소
: 이름 하나만 기억하면 되기 때문
2) 가독성 증가
3) 기능 예측 가능
: 이름을 보고 기능을 어느정도는 예측할 수 있다.
4) 메서드 이름 절약
- 오버라이딩과 오버로딩의 차이
1. 오버라이딩은 매개변수 타입이 동일해야 하고,
오버로딩은 매개변수 타입이 달라야한다.
2. 오버라이딩은 리턴 타입이 동일해야 하고
오버로딩은 반환 타입은 오버로딩을 구현하는데 아무런 영향을 주지 못한다.
다음 글
https://eboong.tistory.com/408
https://eboong.tistory.com/564?category=1019301
출처
https://st-lab.tistory.com/151
https://devlogofchris.tistory.com/35
- Java의 정석
'여니의 프로그래밍 study > Java' 카테고리의 다른 글
[Java] 조건문 , 반복문, 배열 (0) | 2022.07.04 |
---|---|
[Java] 문자열 생성시 String과 new String()의 차이 (0) | 2022.07.04 |
[Java] 연산자 (+증감 연산자, 비교 연산자, 논리 연산자) (0) | 2022.07.04 |
[Java] 데이터 타입 (+double형, float형 ), 형변환 (0) | 2022.07.04 |
[Java] 숫자와 문자, 문자열 (0) | 2022.07.04 |