-
항해99 2주차 WIL카테고리 없음 2022. 5. 22. 23:10
Weekly I Learned
5/16 ~ 5/19 : 알고리즘
5/20 ~ 5/22 : 주특기 입문(Spring)
팀원들과 문제 풀이를 진행하며 동일한 문제를 다양하게 접근 하는 방식을 공유 할 수 있었다. 그리고 내가 푼 문제를 설명하는데 어려움을 종종 느꼈는데 코드를 완전히 이해 하지 못하고 답만 도출하였던거 같아 사용하는 함수들을 조금더 깊이 있게 공부하는데 포인트를 맞추었다
핵심 키워드
객체지향 프로그래밍이란? (OOP : Object Oriented Programming)
컴퓨터 프로그래밍 패러다임 중 하나로, 컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러 개의 독립된 단위, 즉 "객체"들의 모임으로 파악하고자 하는 것. 각각의 객체는 메시지를 주고받고, 데이터를 처리할 수 있다.
프로그램을 유연하고 변경이 쉽게 만들기 때문에 대규모 소프트웨어 개발에 많이 사용된다. 또한 프로그래밍을 더 배우기 쉽게 하고 소프트웨어 개발과 보수를 간편하게 하며, 보다 직관적인 코드 분석을 가능하게 하는 장점이 있다
프로그래밍 패러다임
- 객체지향 프로그래밍 : JAVA, C++
객체 간의 메시지 통신을 이용 - 절차적 프로그래밍 : FORTRAN, COBOL, PASCAL, C
컴퓨터에 저장된 명령어들이 순차적으로 실행 - 함수형 프로그래밍 : LISP
수학적 수식과 같은 함수들로 프로그램을 구성하여 호출 - 논리형 프로그래밍 : 프롤로그
논리 문장을 이용하여 프로그램을 표현하고 계산을 수행하는 개념에 기반한 방식
객체지향 프로그래밍 구성요소
객체(Object) : 개체, 속성, 메서드로 구성된 클래스의 인스턴스를 의미
개체(Entity) - 현실 세계에 보이는 본질을 의미
속성(Attribute) - 자료 저장소 역할을 하며, 절차 지향 프로그래밍의 변수와 대응
메서드(Method) - 호출 단위를 의미하며, 절차 지향 프로그래밍의 함수와 대응클래스(Class) : 객체를 표현하는 추상 데이터 타입으로 객체를 생성하는 틀(설계도)
클래스를 통해 추상화된 자료형을 제공메시지(Message) : 객체 간의 통신
객체지향 4가지 핵심개념
- Encapsulation(캡슐화)
연관있는 객체의 속성(data fields)과 행위(methods)를 하나의 클래스에 묶고, 객체 내부 구조를 외부로 숨기고(은닉) 외부와 데이터를 주고 받을 메서드를 통해 객체를 다루도록 한다.
멤버변수를 private 접근제한자로 숨기고 Getter/Setter 메서드를 통해 외부로 데이터를 주고받도록 하는 것이다.
- Inheritance(상속)
객체들 간의 관계를 구축하는 방법이다. 클래스로 객체가 정의되는 고전 상속에서, 클래스는 기반 클래스, 수퍼클래스, 또는 부모 클래스 등의 기존의 클래스로부터 속성과 동작을 상속받을 수 있다. 그 결과로 생기는 클래스를 파생 클래스, 서브클래스, 또는 자식 클래스라고 한다. 상속을 통한 클래스들의 관계는 계층을 형성한다. 프로토타입 기반 프로그래밍에서는, 객체가 클래스를 따로 정의할 필요 없이 다른 객체로부터 직접 정의될 수 있다. 이러한 특징을 차등 상속이라고 부른다.
- Abstraction(추상화)
복잡한 자료, 모듈, 시스템 등으로부터 핵심적인 개념 또는 기능을 간추려 내는 것을 말한다. 간추려 낸 것을 관련있는 것들로 묶게 되면 캡슐화가 되며 그 주체는 클래스이다.
- Polymorphism(다형성)
프로그래밍 언어의 자료형 체계의 성질을 나타내는 것으로, 프로그램 언어의 각 요소들(상수, 변수, 식, 오브젝트, 함수, 메소드 등)이 다양한 자료형(type)에 속하는 것이 허가되는 성질을 가리킨다. 반댓말은 단형성(monomorphism)으로, 프로그램 언어의 각 요소가 한가지 형태만 가지는 성질을 가리킨다.
객체지향 프로그래밍 3단계
1. 분석 - 객체 모델링
객체의 구성요소(속성)와 동작(기능)을 추출하는 과정
1) 일반화 - 대상 객체들의 공통점을 추출하여 상위 개념을 정의하는 것
2) 구체화 - 특정 객체로부터 상세한 특징을 부여하여 하위 개념을 정의
2. 설계 - 클래스 정의
객체의 설계도에 해당하는 클래스를 정의하는 과정
1) 객체의 구성요소(속성) = 멤버변수
- 객체가 갖는 고유한 속성(값)을 저장하기 위한 변수(멤버변수)를 선언
2) 객체의 동작(기능) = 메서드
- 객체가 행하는 특정 기능을 수행하기 위한 메서드를 정의
3. 구현 - 객체 생성(= 인스턴스화)
new 키워드를 사용하여 설계된 클래스를 바탕으로 메모리 공간(Heap)에 실제 객체(인스턴스) 생성
생성된 공간의 주소를 저장하는 참조변수를 통해 해당 객체에 접근 가능
JVM(Java Virtual Machine)
운영체제에 독립적인 프로그래밍이 가능하도록 하는 가상의 CPU이다. 풀어서 설명하면 프로그래밍을 할때 windows나 macos등 운영체제에 따라 작업할 필요 없이 한번의 작업 만으로 어떠한 운영체제에서도 동작 가능하도록 해주는 것이다. 이론적으로 모든 자바 프로그램은 CPU나 운영 체제의 종류와 무관하게 동일하게 동작할 것을 보장한다.
- 실행될 클래스 파일을 메모리에 로드 후 초기화 작업 수행
- 메소드와 클래스변수들을 해당 메모리 영역에 배치
- 클래스로드가 끝난 후 JVM은 main 메소드를 찾아 지역변수, 객체변수, 참조변수를 스택에 쌓음
- 다음 라인을 진행하면서 상황에 맞는 작업 수행(함수 호출, 객체 할당 등)
JVM 실행 절차
- Java로 작성한 코드(.java)가 컴파일
- 바이트코드(.class)파일로 만들어짐
- 이 파일은 JVM을 거쳐서 기계어 코드파일로 변환된다.
참고자료
- 위키백과
- https://hoonmaro.tistory.com/19 (훈마로의 보물창고)
- https://velog.io/@dev_isaac/JVM (dev_isaac.log)
주간 마무리
본격적인 Spring 공부에 돌입했다. 알아야 하는 기초 개념들이 너무도 많아 하나하나 이해를 해나가는데 벅참을 느낀다. 모든 개념을 다 이해하고 시작하면 더할나위 없이 좋겠지만 욕심내기보단 느리더라도 꾸준함으로 진행하여야겠다. 이번주에 배운개념중 위에 나열한 객체지향과 JVM 외에도 JPA의 개념에 대해 깊은 공부를 하였다. 새로 시작되는 주 역시도 코드를 작성하는 것보단 JAVA 개념에 대한 이론적 학습이 주가 될것으로 예상된다
- 객체지향 프로그래밍 : JAVA, C++