항해 2주차가 끝났다. 2주차에는 알고리즘 문제를 처음 접하였다. 새로운 팀이 배정되고 내가 팀장이 된 것을 알았다. 처음엔 조금 떨렸다. 팀장으로써 책임감도 들었고, 알고리즘이라는 새로운 것을 공부한다는 생각에 더 긴장이 되었던 것 같다.
항해 시작 전에 본인이 선택했던 언어, 난 자바로 알고리즘 문제를 풀어야 했다. 자바 기초 지식도 부족하고 알고리즘도 처음이고 첫 날은 정말 정신이 없었다. 그래서 공부계획을 세운 SA를 17시까지 제출했어야 했는데 깜박하고 늦게 냈다.. ㅎ 매일 9문제씩 우리 조의 경우 3명이여서 인당 세 문제를 맡아서 발표했다. 처음에는 정말 감이 잘 안와서 답을 보면서 이해하고 코드를 따라해보았다. 그러다 한 15번 문제 내적을 풀 때에는 스스로 생각해보고 코드를 짜서 처음 혼자 힘으로 문제를 풀어보았다. 난이도가 쉽고 어렵고를 떠나서 너무 뿌듯하고 기분이 좋았다.
월요일에는 CS 스터디 발제가 있었다. CODE 책으로 조원들과 번갈아가며 책을 읽고 발표하는 시간을 갖는 스터디였다. 이 책을 통해 전산학의 기초를 조금 다져보면 좋을 것 같다.
화요일에는 모의고사가 있었다. 사실 계속 걱정되었다. 아직 많이 부족한데 만약 문제를 풀지 못하면 어쩌지 하는 생각에 겁을 많이 먹었었는데, 다행히 풀 수 있는 문제가 나와서 잘 풀고 영상도 잘 제출했다.
수요일에는 항해톡 발표가 있었다. 처음 신청했던 주제는 HTTPS인데 매니저님께서 혹시 다른 주제로 하실 수 있냐고 여쭤보셔서 아쉽지만 알겠다고 했다.
그렇게 새로 받은 주제는 REST API였다. 좀 더 잘 발표할 수 있었는데 하는 아쉬움은 있지만 후회는 없다. 좋은 기회였고, 재밌는 경험이 됐다.
목요일에는 실전 알고리즘 테스트가 있었다. 전날 항해톡을 준비하느라 알고리즘 문제를 거의 못풀어서 그새 머리가 굳었으면 어떡하지 하는 걱정이 들었지만 그럴 시간에 한 문제라도 다시 더 풀자 싶어서 풀었던 문제를 복습하고 충분히 내 것으로 만드는 시간을 보냈다. 다행히 또 문제를 풀어서 가벼운 마음으로 시험장을 나섰다.
조별 자리로 돌아와서는 2번 문제가 궁금했다. 끙끙대며 풀다가 안돼서 여기저기 물어보다 풀이를 알아냈다. 1번 문제와 2번 문제의 난이도 차이가 정말 많이 난다고 생각했다. 그래도 알고리즘 문제를 풀어봤다는 것에 의의를 두고 앞으로 여유시간이 생기면 틈틈이 풀어보고 공부하면 좋겠다는 생각이 들었다.
이번 주차에는 자바 문법 중에서 조건문과 반복문을 많이 사용하고 배울 수 있었다. 그 외에도 Array, 배열과 반복문을 활용해 문제를 푸는 법, 숫자열을 문자열로 바꾸는법, 문자열을 숫자로 바꾸는법, String이 뭔지, Integer와 Int는 무슨 차이가 있는지 문자열의 길이를 나타낼 때에는 뒤에 괄호 표시를 해줘야한다는 등 문제를 풀며 다양한 문법들을 검색해보고 공부하였다.
프로젝트를 따로 하지 않았는데도 이번 주차는 유독 빠르게 지나간 것 같다. 매일매일 공부할 내용이 많았고 또 그만큼 배우는 것도 많아 힘들었지만 좋은 사람들 덕에 잘 버티고 또 무사히 지나온 것 같다. 3주차도 화이팅 !!!
객체지향 프로그래밍이란?
자바를 공부하며 가장 궁금했던 내용이었다. 객체 지향, 객체를 지향적으로 하는 프로그래밍,,?
사실 객체라는 말도 와닿지 않는다. 그래서 유튜브도 찾아보고 블로그도 찾아보면서 객체지향 프로그래밍이 무엇인지 공부해 내린 결론은 아래와 같다.
좀 더 편리하게 코딩하기 위한 것! 그래도 그 정의와 키워드, 장단점을 보면 왜 사용해야하는지 좀 더 이해가 잘 된다.
| 객체지향 프로그래밍(Object Oriented Programming)
객체 지향 프로그래밍이란, 프로그래밍에서 필요한 데이터(객체로 취급)를 추상화시켜 상태와 행위를 가진 객체(class)를 만들고, 그 객체들 간 유기적인 상호작용을 통해 로직을 구성하는 프로그래밍 방법
| 객체지향 프로그래밍의 키워드 다섯 가지
- 클래스와 인스턴스(객체)
- 추상화
- 캡슐화
- 상속
- 다형성
1. 클래스와 인스턴스(객체)
클래스(class)
자바에서 클래스는 객체를 정의하는 틀 또는 설계도와 같은 의미로 사용된다.
자바에서는 설계도인 클래스를 가지고 여러 객체를 생성하여 사용하게 된다.
클래스는 객체의 상태를 나타내는 필드(field)와 객체의 행동을 나타내는 메소드(method)로 구성된다.
즉 필드(field)란 클래스에 포함된 변수(variable)을 뜻하고, 메소드(method)는 어떠한 특정 작업을 수행하기 위한 명령문의 집합이라 할 수 있다.
인스턴스(instance)
클래스에서 정의한 것을 토대로 실제 메모리상에 할당된 것이다.
클래스로부터 객체를 선언하는 과정을 클래스의 인스턴스화라고 한다.
클래스를 통해 생성된 인스턴스들은 서로 다른 각자의 이름을 가지고 있고 독립된 속성과 기능을 갖는다.
2, 추상화(자료의 추상화)
불필요한 정보는 놔두고, 중요한 정보만을 표시함으로서 공통의 속성이나 기능을 묶어 이름을 붙이는 것이다.
책상, 의자, 옷장, 화장대라는 이름을 가진 객체가 각각 있고, 이 객체들을 가구라는 추상적인 객체로 크게 정의하여 묶는 것을 추상화라고 한다.
3. 캡슐화
캡슐화의 목적은 두 가지가 있다. 코드를 재수정 없이 재활용하는 것과 접근 제어자를 통한 정보 은닉이다.
캡슐화를 통해 관련된 기능과 특성을 한 곳에 모으고 분류하기 때문에 코드의 재활용이 원활해진다.
객체 지향 프로그래밍에서 기능과 특성의 모음을 "클래스"라는 "캡슐"에 분류해서 넣는 것이다.
캡슐화의 예제
JAVA의 경우 접근제어자를 통해 객체의 캡슐화를 구현한다.
ex) public : 다른 객체에서 해당 객체의 인스턴스를 생성하여 접근할 수 있다.
private : 선언된 객체 내부에서만 사용 가능하며, 외부에선 어떠한 방법으로든 해당 지시자를 가진 변수 혹은 메소드를 사용할 수 없다. ( 👉 그래서 private으로 선언된 데이터를 사용하기 위해서는 Setter와 Getter를 사용한다.)
이 외에도 더 많은 예가 있다.
4. 상속
상위 개념의 특징을 하위 개념이 물려받는 것이다.
부모 클래스의 속성과 기능을 그대로 물려받아 사용할 수 있고, 기능의 일부분을 변경해야 할 경우 상속받은 자식 클래스에서 해당 기능만 다시 수정하여 사용할 수 있다.
5. 다형성
하나의 변수명, 함수명 등이 상황에 따라 다른 의미로 해석될 수 있는 것이다.
- 오버라이딩 : 부모클래스에서 정의된 작업이 자식클래스에서 다른 것으로 대체될 수 있는 것을 말한다.
- 오버로딩 : 같은 이름의 함수를 여러개 정의하고 매개변수의 타입과 개수를 다르게 하여 매개변수에 따라 호출할 수 있는 것이다.
| 객체지향 프로그래밍의 장단점
장점
- 코드 재사용 용이
: 남이 만든 클래스를 가져와서 이용할 수 있고, 상속을 통해 확장해 사용할 수 있다. - 유지 보수 편리
: 수정해야할 부분이 클래스 내부에 있으므로 해당 부분만 수정하면 된다. - 대형 프로젝트에 적합
: 클래스 단위로 모듈화 시켜서 개발하므로 업무 분담의 편리성이 향상된다.
단점
- 처리속도가 상대적으로 느림
- 객체, 즉 클래스의 수가 증가하면 용량이 커질 수 있다.
- 설계 시 많은 시간과 노력이 필요하다.
JVM
자바 *바이트코드는 JRE(Java Runtime Environment) 위에서 동작한다. 이 JRE에서 가장 중요한 요소는 자바 바이트코드를 해석하고 실행하는 JVM(Java Virtual Machine)이다. JVM의 역할은 자바 애플리케이션을 클래스 로더(Class Loader)를 통해 읽어 들여서 자바 API와 함께 실행하는 것이다.
* 바이트코드(Bytecode, portable code, p-code)는 특정 하드웨어가 아닌 가상 컴퓨터에서 돌아가는 실행 프로그램을 위한 이진 표현법
단순하게 말하면 바이트코드를 실행시켜주는 가상의 컴퓨터, 자바 파일을 실행시킬 수 있도록 돕는 것이라 생각하면 이해가 쉬울 것 같다.
자바 코드가 JVM에 전달되는 과정은 다음과 같다.
- 작성한 자바소스(.java)를 자바 컴파일러(javac)를 통해 자바 바이트 코드(.class)로 컴파일한다.
- 컴파일된 바이트 코드(.class)를 JVM의 클래스로더(Class Loader)에게 전달한다.
- 클래스로더는 동적로딩(Dynamic Loading)을 통해 필요한 클래스들을 로딩 및 링크하여 런타임 데이터 영역(Runtime Data Area), 즉 JVM의 메모리에 올린다.
- 실행엔진(Execution Engine)은 JVM메모리에 올라온 바이트 코드들을 명령어 단위로 하나씩 가져와서 실행한다.
즉, JVM은 자바 바이트 코드(.class 파일)를 OS에 특화된 코드로 변환(인터프리터와 JIT 컴파일러)하여 실행한다.
| JVM의 구조
| 클래스 로더 시스템
| 참고자료
'스파르타코딩클럽 > 항해99' 카테고리의 다른 글
항해99 6기 DAY 15 TIL _ 22.03.21 (0) | 2022.03.22 |
---|---|
항해99 6기 DAY 14 TIL _ 22.03.20 (0) | 2022.03.21 |
항해99 6기 DAY 13 TIL _ 22.03.19 (0) | 2022.03.20 |
항해99 6기 DAY 12 TIL _ 22.03.18 (0) | 2022.03.19 |
웹개발의 봄, Spring 1주차 (0) | 2022.03.18 |