코드와이
[Java] Java & 객체지향 본문
Java & 객체지향
- 장점
- JVM에서 동작
- 특정 운영체제에 종속되지 않는다.
- 객체지향 언어
- 캡슐화, 상속, 추상화, 다형성 등
- 비교적 이해하고 배우기 쉽다.
- 유지보수가 쉽다.
- GC를 통한 자동 메모리 관리
- OpenJDK가 오픈소스
- 자바는 스레드 생성 및 제어와 관련된 라이브러리 API를 제공하고 있기 때문에 실행되는 운영체제에 상관없이 멀티 스레드를 쉽게 구현 가능
- JVM에서 동작
- 단점
- JVM에 의해 기계어로 번역되고 실행하는 과정을 거치기 때문에 C나 C++의 컴파일 단계에서 만들어지는 완전한 기계어보다는 속도가 느리다
- 불편한 예외처리
- 접근 제어자
- public(+) : 어떤 클래스의 객체에서든 접근 가능
- private(-) : 이 클래스에서 생성된 객체들만 접근 가능
- protected(#) : 이 클래스와 동일 패키지에 있거나 상속 관계에 있는 하위 클래스의 객체들만 접근 가능
- package(~) : 동일 패키지에 있는 클래스의 객체들만 접근 가능
- 데이터 타입
- 기본 데이터 타입
- byte, short, char, int ...
- 크기가 작고 고정적이기 때문에 Stack 영역에 저장
- 참조 타입
- class, array, interface ...
- 크기가 가변적이고 동적이기 때문에 Heap에 저장
- 더 이상 참조하는 변수가 없을 때 GC에 의해 파괴
- 기본 데이터 타입
- Wrapper class
- 메소드의 인수로 객체 타입만이 요구되면, 기본 타입의 데이터를 그대로 사용할 수는 없다.
- 따라서 기본 타입을 객체로 변환시켜주어야 한다.
- Wrapper class는 java.lang 패키지에 포함되어 제공된다
기본 타입 래퍼 클래스 byte Byte short Short int Integer long Long float Float double Double char Character boolean Boolean
- OOP 특징
- 추상화
- 구체적인 사물들의 공통적인 특징을 파악하여 이를 하나의 개념으로 다루는 것
- 캡슐화
- 정보 은닉 : 필요 없는 정보는 외부에서 접근하지 못하도록 제한
- 높은 응집도, 낮은 결합도를 유지하여 유연함과 유지보수성 증가
- 일반화 관계(상속)
- 여러 개체들이 가진 공통된 특성을 부각시켜 하나의 개념이나 법칙으로 성립시키는 과정
- 다형성
- 서로 다른 클래스의 객체가 같은 메시지를 받았을 때 각자의 방식으로 동작하는 능력
- 오버라이딩, 오버로딩
- 오버라이딩
- 임의의 클래스가 다른 클래스를 상속 받거나 인터페이스를 구현했을 때 상위 클래스 또는 인터페이스에 정의되어 있는 메소드를 재정의하여 사용하는 것이다. 메소드 호출 시 재정의 되어 있지 않다면 상위 클래스의 메소드가 호출된다.
-
public abstract class A { public void printMe() { System.out.println("AAA"); } } public class B extends A { @Override // 개발자의 실수를 방지하기 위해@Override(annotation) 쓰는 것을 권장 public void printMe() { System.out.println("BBB"); } }
- 오버로딩
- 메소드에 주어진 인자에 따라 동작을 다르게 구현할 수 있다. 코드의 중복이 줄어들고 가독성이 늘어난다. 반환형은 관계가 없지만, 인자의 개수, 인자의 타입에 따라 다르게 구현할 수 있다.
-
void example(int a){ return a; } void example(String a){ retunr a; }
- 오버라이딩
- 추상화
- OOP 5대 원칙(SOLID)
- S : 단일 책임 원칙
- 객체는 단 하나의 책임만 가져야 한다.
- O : 개방-폐쇄 원칙
- 기존의 코드를 변경하지 않으면서 기능을 추가할 수 있도록 설계되어야 한다.
- L : 리스코프 치환 원칙
- 자식 클래스는 최소한 자신의 부모 클래스의 기능을 모두 수행할 수 있어야 한다.
- I : 인터페이스 분리 원칙
- 인터페이스를 클라이언트에 특화되도록 분리시키라는 설계 원칙이다.
- D : 의존 역전 원칙
- 의존 관계를 맺을 때 변화하기 쉬운 것 또는 자주 변화하는 것보다 변화하기 어렵고 변화가 거의 없는 것에 의존해야 한다.
- S : 단일 책임 원칙
- 절차지향 VS 객체지향 프로그래밍
- 절차지향
- 절차를 정하고 그 절차에 맞도록 프로그래밍
- 일의 흐름에 중점
- 객체지향
- 객체 간의 관계, 상호 작용을 나타낼 수 있는 함수와 변수를 설계 및 구현
- 연관되어 있는 함수와 변수를 하나의 그룹으로 묶어서 그룹핑(핵심)
- 하나의 클래스를 바탕으로 서로 다른 상태를 가진 인스턴스를 만들면 서로 다른 행동을 하게 된다.(재활용성)
- 절차지향
- 객체지향 장점
- 객체를 중심으로 프로그래밍하기 때문에 사람의 관점에서 프로그램을 이해하기 쉽다.
- 강한 응집력, 약한 결합력
- 재사용성, 확장성, 융통성이 높다.
- 디버깅과 유지보수가 용이하고 설계와 분석이 쉽다.
- 객체지향 단점
- 객체 간의 정보 교환이 모두 메시지 교환을 통해 일어나므로 실행 시스템에 많은 overhead가 발생한다.
- 처리속도 저하
- but 하드웨어 발전으로 이러한 단점 커버
- 예상치 못한 부작용 발생 가능
- 애플리케이션 내에서 버그 발생
- 객체 간의 정보 교환이 모두 메시지 교환을 통해 일어나므로 실행 시스템에 많은 overhead가 발생한다.
- static
- 클래스가 로딩될 때 생성
- 프로그램이 종료될 때 제거
- 동일한 클래스의 모든 객체들에 의해 공유된다.
- java의 main 메소드는 왜 static인가?
- JVM은 인스턴스가 없는 클래스의 main()을 호출해야 되기 때문에 static이어야 한다.
- JVM & static
- 코드를 실행하면 컴파일러가 .java 코드를 .class로 변환한다.
- 클래스 로더가 .class 파일을 메모리 영역에 로드한다.
- Runtime Data Area 중 MeThod Area( = Static Area)라고 불리는 영역에 Class Variable이 저장되는데, static 변수 또한 여기에 포함된다.
- JVM이 Method Area에 로드된 main()을 실행한다.
- 클래스 vs 객체 vs 인스턴스
- 클래스
- 객체를 만들어 내기 위한 틀
- 연관되어 있는 변수와 함수의 집합
- 객체
- 구현할 대상
- 클래스의 인스턴스라고도 불림
- 모든 인스턴스를 대표하는 포괄적인 의미
- OOP의 관점에서 클래스의 타입으로 선언되었을 때 '객체'라고 부른다.
- 인스턴스
- 구현된 구체적인 실체
- OOP관점에서 객체가 메모리에 할당되어 실제 사용될 때 '인스턴스'라고 부른다.
- 추상적인 개념과 구체적인 객체 사이의 관계에 초점을 맞출 경우에 사용
-
public class Animal{ ... } public class Main { public static void main(String[] args){ Animal cat; // 객체 cat = new Animal(); // 인스턴스 } }
- 클래스
- Call by Reference vs Call by Value
- (공통) 함수가 호출될 때, 메모리 공간 안에서는 함수를 위한 별도의 임시 공간이 생성
- Call by Reference(참조에 의한 호출)
- 함수 호출 시 인자로 전달되는 변수의 레퍼런스를 전달(해당 변수를 가르킴)
- 따라서 함수 안에서 인자의 값이 변경되면, 인자로 전달된 변수의 값도 함께 변경
- Call by Value(값에 의한 호출)
- 함수 호출 시 인자로 전달되는 변수의 값을 복사하여 함수의 인자로 전달
- 복사된 인자는 함수 안에서 지역적으로 사용되는 local value의 특성을 갖음
- 따라서 함수 안에서 인자의 값이 변경되어도, 외부의 변수의 값은 변경되지 않는다.
- Java는 Call by Value이다.
- 기본 자료형의 경우 해당 변수값을 복사해서 전달
- 참조 자료형일 경우 해당 변수의 값이 레퍼런스이므로 그 레퍼런스를 복사형 전달
- Reference
'Java' 카테고리의 다른 글
[Java] GC(가비지 콜렉터, Garbage Collector) (0) | 2021.11.28 |
---|