회원가입을 하면 원하는 문장을
저장할 수 있어요!
다음
AWS 이용 중이라면 최대 700만 원 지원받으세요
이전 글 ‘이론편’에서는 자바의 라이프 사이클과 기초 지식에 대해 설명했습니다. 실무 편에서는 해당 라이프 사이클의 코드와 적용 방법에 대해 설명해 보려고 합니다.
회원가입을 하면 원하는 문장을
저장할 수 있어요!
다음
회원가입을 하면
성장에 도움이 되는 콘텐츠를
스크랩할 수 있어요!
확인
이전 글 ‘이론편’에서는 자바의 라이프 사이클과 기초 지식에 대해 설명했습니다. 실무 편에서는 해당 라이프 사이클의 코드와 적용 방법에 대해 설명해 보려고 합니다.
자바는 객체지향 프로그래밍 언어로서 모든 데이터 타입이 클래스 혹은 인터페이스로 정의됩니다. 자바는 다양한 자료형을 지원하는데 각 자료형의 크기와 값을 다루는 방식이 다릅니다. 지원하는 자료형은 다음과 같습니다.
① 기본 자료형(Primitive types)
boolean, byte, char, short, int, long, float, double으로 8가지가 있습니다. 기본 자료형은 스택 메모리에 직접 값을 저장합니다.
② 참조 자료형
객체는 클래스와 인터페이스로 정의되며 스택 메모리는 메모리 주소를 저장하고, 객체는 힙 메모리에 생성됩니다. 모든 최상의 클래스는 java.lang.Object이며 모든 클래스는 java.lang.Object를 상속받아 생성됩니다.
따라서 오브젝트 클래스에서 제공하는 toString(), equals(), hashCode() 등 우리가 직접 개발하지 않은 함수들을 사용할 수 있으며 오브젝트 타입의 변수에 모든 객체를 넣을 수 있습니다.
기본 자료형 변수의 크기는 해당 자료형의 크기와 동일하며, 수정 시 메모리에 직접적으로 접근하여 수정이 이루어집니다. 참조 자료형은 스택 메모리에 주솟값이 저장되며, 일반적으로 4바이트 또는 8바이트로 이루어져 있습니다. 참조 자료형의 수정 시 스택 메모리에서 주솟값을 찾아 힙 메모리에 있는 값을 수정합니다.
예시를 들어보자면, 내 컴퓨터에 있는 텍스트 파일은 더블 클릭 시 해당 내용을 볼 수 있습니다. 또한 저장을 할 경우 내 컴퓨터에 저장됩니다.(기본 자료형) 요즘IT와 같은 블로그에서 글을 보기 위해서는 주소를 입력하거나 게시글을 클릭해야 볼 수 있습니다. 해당 게시글은 내 컴퓨터가 아닌 요즘IT 서버에 존재하며, 댓글을 달기 위해서는 로그인을 해야 합니다. 즉 해당 글에 직접적인 접근이 아닌 중간에 경유하여 접근할 수 있습니다.(참조 자료형)
자바가 객체지향언어인 이유는 캡슐화, 상속, 다형성, 추상화 특성을 가지고 있기 때문입니다.
① 캡슐화(encapsulation)
“객체 내부에 직접적인 접근을 제한하여 데이터의 무결성과 보안을 보장한다.”라는 사전적 정의가 있습니다. 쉽게 풀면 private, public, default, protected를 클래스, 메소드, 변수 앞에 정의함으로써 접근할 수 있는 범위를 제한하는 것을 캡슐화라고 합니다.
② 상속(inheritance)
“클래스 간의 상속을 통해 코드의 재사용성과 유지 보수성을 향상시킨다”라는 사전적 정의를 쉽게 풀면 클래스 뒤에 extends 클래스명(ClassName)을 추가함으로써 클래스명에 존재하는 메소드를 사용할 수 있음을 말합니다.
③ 다형성(polymorphism)
“동일한 이름의 메소드를 다양한 형태로 사용할 수 있습니다.”라는 사전적 정의가 있으며 오버로딩(Overloading)과 오버라이딩을 통해 다양한 동작을 수행할 수 있습니다.
오버로딩은 동일한 이름을 가진 메소드의 파라미터(매개변수)를 다르게 하여 처리할 수 있도록 하는 것입니다.
위 코드처럼 같은 이름의 메서드를 파라미터를 다르게 하여 만드는 것을 말합니다.
오버라이딩(Overriding)는 상속 관계에서 부모 클래스를 자식 클래스에서 재정의 하는 것을 말합니다.
위 코드처럼 상위 클래스에서 만든 메소드를 하위 클래스에서 다시 만드는 것을 말합니다.
오버로딩과 오버라이딩을 구별하기 어렵다면 ‘오버로딩은 여러 개를 읽는다. 오버라이딩은 무언가의 위에 올라탄다’는 개념으로 이해하면 더 쉽습니다.
④ 추상화(abstraction)
‘객체의 공통적인 특징을 추출하여 상위 개념을 정의한다.’라는 사전적 정의가 존재합니다. 쉽게 설명하면 자바의 Interface와 abstract를 사용하여 상속받은 클래스는 오버라이딩을 통해 무조건 구현할 수 있도록 강제화하는 것입니다.
자바의 객체지향언어 4가지 개념을 알아봤는데 외우기 어렵다면 ‘캡상추다’로 첫 글자만 외워두는 것도 하나의 방법입니다.
자바의 메모리 구조는 크게 스택(Stack), 힙(Heap), 스태틱(Static)영역으로 나눌 수 있습니다.
① 스태틱(Static) 영역
스태틱 영역에는 클래스 변수와 정적 메소드가 저장됩니다. 클래스, 클래스 안에 static이 붙은 변수, 메소드 그리고 클래스 이름이 저장됩니다. 해당 메소드와 변수를 선언된 범위 내에서는 어디서든 사용할 수 있으며, 해당 값을 공유가 되며, 할당된 메모리는 프로그램이 종료될 때까지 유지됩니다. 즉 ‘A’라는 클래스에서 public static Integer cnt = 0;으로 선언됐을 때, ‘B’라는 클래스 안 메서드에서 A.cnt=1로 바꿔주면 다시 호출됐을 때 cnt 값은 1이 됩니다.
예를 들면 요즘IT에서 로그인하여 댓글을 작성하거나 닉네임을 바꾸었을 때, 다른 컴퓨터에서 로그인을 하여도 해당 정보를 볼 수 있습니다. 회원 탈퇴를 프로그램 종료로 가정했을 때, 해당 계정에서 작업하면 컴퓨터와 인터넷이 있는 곳 어디서든 접근 가능한 것처럼 스태틱 영역 내에 존재하는 것은 한번 선언되면 어디서든 접근이 가능합니다.
② 스택(Stack) 영역
스택 영역은 메소드 호출과 관련된 정보를 저장합니다. 기본 자료형과 객체를 생성했을 때, 객체의 주솟값을 저장하는 영역입니다. 스택은 후입선출(Last In First Out) 구조로 동작하며 메소드 호출이 끝나면 해당 메소드에서 사용한 스택 영역은 자동으로 사라집니다.
③ 힙(Heap)영역
힙 영역은 동적으로 생성된 객체와 배열이 저장됩니다. 객체와 배열은 런타임에 생성되기 때문에 크기를 결정할 수 없고 가변적이며 해당 영역은 가비지 컬렉터(GC)에 의해 메모리 관리가 됩니다.
자바 메모리 구조를 통해 실무에서 어떻게 활용되는지 설명하겠습니다.
① new 선언하였을 때
TestClass obj = new TestClass();
위 객체를 생성하면 obj라는 변수는 스택 영역에 선언되며 new TestClass()는 힙 영역에 선언됩니다. 또한 obj = new TestClass();라는 코드를 새로 작성하면 이전에 선언된 TestClass는 가비지 컬렉터에 의해 제거되며 새로운 객체가 생성됩니다.
예를 들면 컴퓨터 구매 후 윈도우를 설치하고 사용하다가 포맷 후 윈도우를 재설치하면 사용하던 윈도우는 사라지고 새로운 윈도우가 생성되는 것으로 생각하면 됩니다.
② 메소드에서 메소드 호출
위와 같은 코드가 있다고 가정했을 때 다음과 같은 일들이 일어납니다.
스프링에서 가장 중요한 개념 중 하나인 의존성 주입(DI)과 제어의 역전(IoC)에 대해 설명하려고 합니다. Spring을 개발하게 되면 @Controller과 @Service, @Configuration, @Component 등을 사용하게 됩니다. 사용하는 IDE(통합 개발 환경) 내에서 @Controller과 @Service, @Configuration를 Ctrl을 누르고 클릭하면 @Component을 상속받아 사용하는 것을 알 수 있습니다. 또한 Spring의 서블릿 컨텍스트 파일 안에 base-package 혹은 Springboot의 @SpringBootApplication을 사용하면 설정된 패키지 안에 있는 클래스 중 @Component가 사용된 것들을 읽어 스태틱 영역에 두게 됩니다. 따라서 객체를 사용할 때, new 선언을 하지 않고 @Autwored를 사용할 수 있는 것을 제어의 역전, 의존성 주입이라고 합니다.
위와 같은 코드가 있을 경우 list의 결과값은 아래와 같이 표출이 됩니다.
위와 같은 코드가 있을경우 list의 결과값은 직접 실행해보시는 것을 권장드립니다.
위 코드의 list 주솟값을 출력하면 아래와 같은 결과가 출력됩니다.
위 코드의 결과를 실행하였을 때 자바의 메모리 구조에 의해 어떤식으로 동작할지 한번 상상해 보시기를 바랍니다.
자바 이론 편에서 다룬 라이프 사이클 중 클래스 로딩과 실행, 메모리 관리에 대해 알아보았습니다. 다른 언어를 배울 때도 해당 언어의 메모리 구조와 라이프 사이클을 공부한 후 개발하면 언어에 조금 더 쉽게 접근할 수 있습니다. 추후 기회가 된다면 컴파일 과정과 클래스 로딩에서 에이전트(Agent)라는 것을 심어 내가 원하는 코드를 삽입하는 기술에 대해 다뤄보겠습니다.
이번 글을 마지막으로 ‘Spring(Java) 개발자를 위한 완전 기초 지식’ 시리즈를 마무리하겠습니다.
요즘IT의 모든 콘텐츠는 저작권법의 보호를 받는 바, 무단 전재와 복사, 배포 등을 금합니다.