2주차는 프로그래밍 기초 주차로 자바에 익숙해 지기 위한 주차였다.
사실 자바에 대해 언어스터디에서 공부를 하고 있지만 알고리즘, 자료구조는 커녕 클래스도 이제 막 배우고 있는데, 걷기반/달리기반으로 나뉘어 알고리즘 문제를 풀어야 한다는게 걱정이 되기도 했다.
그렇지만 꾸준히 Leve0 문제를 풀어왔던 게 도움이 되었는지 생각만큼 버거운 한주는 아니었던 것 같다.
개인적으로 프로그래밍 기초 주차에는 코드가 깔끔하고,짧고를 떠나서 무조건 알고리즘을 많이 풀어보고 익숙해진다!에 초점을 맞추었었는데, 덕분에 알고리즘 테스트도 크게 어려움 없이 넘어갈 수 있었고 문제를 보고 코드로 구현해 내는 것에 어느정도 익숙해 질 수 있었다.
그리고 3주차 주특기 주차에 들어가기 앞서 2주차 과제를 해결해야 했는데, 이 과제를 통해 객체지향
이란 무엇인가 더 생각해 볼 수 있었다.
하나의 상위클래스와 그를 상속받은 하위클래스 둘을 사용하여 요구사항을 구현해내는 과제였는데, 클래스를 설계하고 요구사항 구현을 위해 메소드를 작성하려니 참 막막했었다.
어찌어찌 요구사항과 시나리오대로 기능할 수 있게끔 코드를 짜기는 했지만 여러모로 아쉬움이 남은 과제였다.
앞으로 언어스터디 진도에 만족하지 않고 열심히 자바 기초를 학습해서 스프링을 학습하며, 보다 더 객체지향 스러운 코드를 작성하고 싶다.
프로그래밍에서 필요한 데이터를 추상화시켜 상태
와 행위
를 가진 객체
를 만들고, 그 객체들간의 유기적인 상호작용을 통해 로직을 구성하는 프로그래밍 방법이다.
간단히 말해, 상태와 행위를 가진 객체들을 레고 블럭처럼 조립해서 하나의 프로그램을 만드는 것을 객체 지향 프로그래밍이라고 할 수 있다.
어떤 영역에서 필요로 하는 속성이나 행동을 추출하는 작업이다.
각 개체의 구체적인 개념에 의존하지 말고 추상적 개념에 의존해야 설계를 유연하게 변경할 수 있다.
캡슐화는 객체지향에서 데이터 구조와 데이터를 다루는 방법을 결합시켜 묶는다.
데이터를 은닉하고 그 데이터를 접근하는 기능을 노출시키지 않는 다는 의미이다.
정보 은닉
을 통해 높은 응집도와 낮은 결합도를 갖도록 한다.private
public
상속이란 상위개념(상위클래스)의 특징을 하위 개념(하위클래스)이 물려받는 것을 의미한다.
하나의 클래스가 가지고 있는 특징(데이터와 함수)들을 그래도 다른 클래스가 물려주고자 할 때 상속의 특징을 사용한다.
다형성은 서로 다른 클래스의 객체가 같은 메시지를 받았을 때 각자의 방식으로 동작하는 능력이다.
자바 가상 머신 JVM(Java Virtual Machine)은 자바 프로그램 실행환경을 만들어 주는 소프트웨어이다.
자바 코드를 컴파일하여 .class 바이트 코드로 만들면 이 코드가 자바 가상 머신 환경에서 실행된다.
JVM은 자바 실행 환경 JRE(Java Runtime Environment)에 포함되어 있다. 현재 사용하는 컴퓨터의 운영체제에 맞는 자바 실행환경 (JRE)가 설치되어 있다면 자바 가상 머신이 설치되어 있다는 뜻이다.
JVM을 사용함으로써 얻는 가장 큰 이점은 JVM을 사용하면 하나의 바이트 코드(.class)로 모든 플랫폼에서 동작하도록 할 수 있다는 것이다.
Java의 경우에는 Java언어로 작성된 Test.java는 컴파일하면 Test.class 파일이 생성된다.
그리고 이렇게 생성된 바이트 코드는 각자의 플랫폼에 설치되어 있는 자바 가상 머신(JVM)이 운영체제에 맞는 실행 파일로 바꿔준다.
즉 Java에서는 C언어와는 달리 JVM을 사용하기 때문에 각자의 플랫폼에 맞게끔 컴파일을 하지 않아도 된다. 하나의 바이트 코드로 JVM이 설치되어 있는 모든 플랫폼에서 동작이 가능하다.
💡Java는 플랫폼에 종속적이지 않지만 JVM은 플랫폼에 종속적이다.
Java는 컴파일된 바이트 코드로 어떤 JVM에서도 동작시킬 수 있지만, JVM은 플랫폼에 의존한다.
윈도우의 JVM과 리눅스의 JVM은 서로 다르다. 자바로 작성된 모든 프로그램은 자바 가상 머신에서만 실행될 수 있으므로, 자바 프로그램을 실행하기 위해서는 반드시 자바 가상 머신이 설치되어 있어야 한다.
JVM 내로 클래스 파일.class
을 로드하고, 링크를 통해 배치하는 작업을 수행하는 모듈이다.
런 타임시 동적으로 클래스를 로드하고 jar 파일 내 저장된 클래스들을 JVM 위에 탑재한다.
즉, 클래스를 처음으로 참조할 때 해당 클래스를 로드하고 링크하는 역할을 한다.
클래스를 실행시키는 역할이다.
클래스 로더가 JVM내의 런타임 데이터 영역에 바이트 코드를 배치시키고, 이것은 실행 엔진에 의해 실행된다.
자바 바이트 코드.class
는 기계가 바로 수행할 수 있는 언어보다는 비교적 인간이 보기 편한 형태로 기술된 것이다.
그래서 실행 엔진은 이와 같은 바이트 코드를 실제로 JVM 내부에서 기계가 실행할 수 있는 형태로 변경한다.
실행 엔진은 자바 바이트 코드를 명령어 단위로 읽어서 실행한다.
하지만 한 줄씩 수행하기 때문에 느리다는 단점이 있다.
인터프리터 방식으로 실행하다가 적절한 시점에 바이트 코드 전체를 컴파일하여 기계어로 변경하고, 이후에는 더 이상 인터프리팅 하지 않고 기계어로 직접 실행하는 방식이다.
더이상 사용되지 않는 인스턴스를 찾아 메모리에서 삭제해준다.
프로그램을 수행하기 위해 OS에서 할당받은 메모리 공간
Thread가 시작될 때 생성되며 생성될 때마다 생성되는 공간으로, 스레드마다 하나씩 존재한다.
Thread가 어떤 부분을 어떤 명령으로 실행해야할 지에 대한 기록을 하는 부분으로 현재 수행 중인 JVM 명령의 주소를 갖는다.
프로그램 실행과정에서 임시로 할당되었다가 메소드를 빠져나가면 바로 소멸되는 특성의 데이터를 저장하기 위한 영역이다. 각종 형태의 변수나 임시 데이터, 스레드나 메소드의 정보를 저장한다.
메소드 호출 시 각각의 스택 프레임(해당 메소드만을 위한 공간)이 생성되며, 메소드 수행이 끝나면 프레임 별로 삭제를 한다.
메소드 안에서 사용되는 값들을 저장한다.
또 호출된 메소드의 매개변수, 지역변수, 리턴 값 및 연산 시 일어나는 값들을 임시로 저장한다.
자바 프로그램이 컴파일되어 생성되는 바이트 코드가 아닌 실제 실행할 수 있는 기계어로 작성된 프로그램을 실행시키는 영역으로, JAVA가 아닌 다른 언어로 작성된 코드를 위한 공간.
Java Native Interface를 통해 바이트 코드로 전환하여 저장하게 된다.
일반 프로그램처럼 커널이 스택을 잡아 독자적으로 프로그램을 실행시키는 영역이다.
클래스 정보를 처음 메모리 공간에 올릴 때 초기화되는 대상을 저장하기 위한 메모리 공간이다.
Static 영역에 존재하는 별도의 관리영역이다.
상수 자료형을 저장하여 참조하고 중복을 막는 역할을 수행한다.