자바를 공부하다 보면 컴파일, 컴파일에러, 런타임 같은 단어를 많이 듣게 될 것입니다. 정적 바인딩과 동적 바인딩에 대해 공부하던 중 컴파일과 런타임을 알아야 이해가 되는 것들이 많아서 먼저 간단하게 이해하고 넘어가려 합니다. 이번 문서에서는 자바의 컴파일과 실행 과정을 알아보겠습니다. 우리가 열심히 java로 간단한 서비스 코드를 작성했습니다. 이후 이 소스코드를 실행시킨다고 생각해보죠, 우리의 코드는 어떤 과정에 의해 실행되는 걸까요? 우리의 소중한 소스 코드는 먼저 컴파일(compile) 되어야 합니다. 컴파일 (compile) 우리가 작성한 자바 코드는 .java 확장자로 저장됩니다. 이 자바 파일을 실행(Run)시키면 자바 컴파일러(javac)에 의해 자바 바이트코드로 작성된 .class 파일로..
JAVA
코드의 배포와 재사용 ❓ 코드의 재사용이란 무엇일까요? 누군가 작성해놓은 소스코드를 복사해서 사용하는 것? 이것은 그냥 사용입니다. 그렇다면 재사용은 무엇일까요? 재사용은 우리가 작성한 코드가 아닌 이미 컴파일 된 바이트코드를 사용하는 것입니다. 그렇다면 내가 생성한 Exam.java 파일을 다른 프로젝트에서 재사용하려면 어떻게 해야할까요? 자바에서 코드를 재사용하려면 내가 생성한 코드를 컴파일 해야합니다. 이 과정에서 Exam.java 파일은 자바 컴파일러에 의해 자바 바이트코드로 변경된 Exam.class 파일로 변경됩니다. 다음으로 컴파일된 바이트코드 파일을 압축 시켜야합니다. Exam.zip 다음으로 확장자를 변경하여 자바를 위한 압축파일 Exam.jar 파일을 생성해야 합니다. 이러한 과정을 배..
나는 “객체지향 프로그래밍이 무엇이냐”고 물어본다면 “객체 간의 협력으로 이루어진 프로그래밍이다” 라고 설명할 것이고, “왜 객체지향 프로그래밍을 해야 하냐?”고 물어본다면 “코드의 재사용성과 유지보수성이 높으니까”, “자바는 객체지향 언어어니까!” 와 같이 교과서적인 답변같은 말을 할 것 같다. 왜냐하면 나도 왜 객체지향이 쓰이는지 잘 모른다,,! 저렇게 배웠으니 저렇게 알고있을 뿐,, 이번 기회에 객체지향에 대해 잘 설명할 수 있도록 학습해보고자 한다. 객체지향 프로그래밍; OOP 프로그램은 절차에 따라 실행된다. 절차에 따라 코드를 작성하게 되면 프로그램의 볼륨이 너무 커지게 된다. 이를 함수로 나누어 구조적인 프로그래밍으로 변경할 수 있을 것이다. 하지만 구조적인 프로그래밍에서도 어떠한 문제가 있..
잘 준비를 마치고 유튜브에서 우연히 자바강의를 찾아서 홀린듯이 보게되었다. 자바를 구조적으로 프로그래밍 하는 방법을 알려주는 강의였다. 그 중 마지막 강의를 보게 되었는데 코드 실행과 함수 호출 스택에 대한 내용을 다루었다. 자바 프로그램이 실행되어 프로세스가 되고, 프로세스의 실행 순서에 따라 코드, 레퍼런스 혹은 일반 변수, 인스턴스가 각각 text, stack, heap 영역에 어떻게 저장되는지 알 수 있었다. 프로그램이 실행되면 작성한 코드들이 바이너리 형식으로 text영역에 로드된다. 이후 main 함수가 호출되기 전에 main함수에 필요한 변수들이 stack 영역에 로딩되고, 인스턴스가 생성되면 동적 메모리 공간인 heap영역에 할당되며 레퍼런스 변수는 heap 메모리 주소값을 가진다. 프로세..
상속은 왜 필요할까? 나는 꽃 장식이 달린 로보트를 만들고 싶다. 하지만 처음부터 꽃 장식이 달린 로봇을 만들기엔 지식도 부족하고 너무 많은 시간이 소요될 것 같은 상황이다. 고민을 하며 걷다가 마침 내가 만들고자 했던 로봇과 외형이 아주 유사한 로봇을 발견하여 구매할 수 있었다. 이제 꽃 장식만 달아주면 완성인 것이다. 이렇게 내가 구현하고자 하는 것과 유사한 클래스를 가져와서 기능을 수정(override)하거나 추가해서 사용하는 것을 상속이라고 한다. 상속이란 상속 (Inheritance)은 새로운 클래스를 정의할 때 이미 구현된 클래스의 속성과 기능을 물려받는 것을 말한다. extends 키워드를 사용하여 상속 관계를 정의할 수 있으며 [상속받는 클래스] extends [상속하는 클래스] 형식으로 ..
스프링부트에서 로그인기능을 만드는 과정에 유저 객체를 생성하고 아무생각 없이 해당 객체를 복사하여 정보를 수정 하였더니 원래의 정보까지 변경되어 버리는 참사가 일어났다.. User user = new User(); User persistenceUser = user; 위의 코드에서 user와 persistenceUser 인스턴스는 같은 주소를 가리킨다. 때문에 둘 중 하나의 참조 변수를 수정하더라도 두 변수 모두 변경이 일어나게 된다. 해당 문제가 발생하는 이유는 user 변수가 참조 타입 변수이기 때문이다. User 의 인스턴스를 생성하고 인스턴스의 주소를 user 변수가 참조하고 있는 것이다. 즉, 값!이 아닌 주소 값!을 가지고 있다는 것. 그렇다면 user의 값을 복사한 persistenceUser..
자바 싱글톤 패턴이란 자바 싱글톤 패턴(Singleton Pattern)은 객체 생성을 단 한 번만 하고, 그 객체를 어디서든지 참조할 수 있도록 하는 디자인 패턴이다. 이는 메모리 낭비를 줄이고 객체의 일관성을 유지하는 데 도움이 된다. 자바에서 싱글톤 패턴은 다음과 같이 구현한다. 생성자를 private으로 선언하여 외부에서 직접 객체를 생성하지 못하도록 한다. 클래스 내부에 자기 자신의 인스턴스를 생성한다. getInstance() 메소드를 통해 생성한 인스턴스를 반환한다. public class Singleton { // 내부에서 자체적으로 인스턴스 생성 private static final Singleton instance = new Singleton(); // 외부에서 인스턴스 생성 불가 pr..
자바에서 클래스와 변수, 메소드에 static 키워드를 사용할 수 있다. 여러 인스턴스가 공유하는 기준 값이 필요한 경우 사용한다. static 키워드를 사용하면 해당 클래스의 여러 인스턴스에서 공유하는 데이터를 만들 수 있다. 또한, static 메소드를 사용하여 해당 클래스의 인스턴스를 생성하지 않고도 호출할 수 있다. static 변수, 메소드는 클래스가 로딩될 때 메모리에 할당된다. 해당 클래스의 인스턴스가 생성되기 전에 이미 메모리에 존재한다. 따라서, static은 프로그램이 실행되는 동안 메모리에 한 번만 할당 되며, 이는 메모리 사용을 줄일 수 있고, 프로그램의 성능을 향상시킨다. 하지만, static 변수를 남발하는 것은 좋지 않다. static 변수가 많아지면, 프로그램의 복잡도가 증가..
객체 간의 협력 (Collaboration) 객체 지향 프로그램에서 객체 간에는 협력이 이루어진다. 자바 객체 간의 협력은 객체 지향 프로그래밍에서 매우 중요하다. 객체는 다른 객체와 상호작용하면서 비즈니스 로직 수행에 필요한 데이터를 처리한다. 협력을 위해서는 먼저 다른 객체에게 요청을 전송해야 한다. 이러한 요청을 메세지라고 한다. 메세지를 처리하는 기능은 메서드이다. 객체는 다른 객체에게 메세지를 전송할 때, 메세지를 처리할 수 있는 메소드를 가지고 있는지 확인한다. 메소드가 존재하면 해당 메소드를 호출하여 메세지를 처리하고 결과를 반환한다. 두 학생이 버스와 지하철을 타는 상황을 구현해 보자. James와 Tomas는 각각 버스와 지하철을 타고 학교에 갑니다. James는 5000원을 가지고 있었..