이전의 포스팅은 접근 방식 자체가 잘못되었다는 것을 깨달았다. 나의 질문이 모호했기 때문에 사람마다 답변이 달랐다고 생각한다. 이전포스팅 [JAVA] int num = 1; num은 어떻게 '값'을 가지며, 비교될까 결론 [JAVA] int num = 1; 그래서 num은 '값'을 가지는가? 이전의 포스팅은 접근 방식 자체가 잘못되었다는 것을 깨달았다. 나의 질문이 모호했기 때문에 사람마다 답변이 달랐다고 생각한다. int a = 1; hyunsb.tistory.com int a = 1; 에서 변수 a는 리터털 1의 값 그 자체를 가진다는 의견과 주소를 가리킨다는 의견으로 나누어졌었다. 그 이유는 의문에 대한 접근 방식이 잘못 되었기 때문이다. 내가 정말 원하는 답변을 얻으려면 질문을 변경해야 한다. "..
분류 전체보기
결론 [JAVA] int num = 1; 그래서 num은 '값'을 가지는가? 이전의 포스팅은 접근 방식 자체가 잘못되었다는 것을 깨달았다. 나의 질문이 모호했기 때문에 사람마다 답변이 달랐다고 생각한다. int a = 1; 에서 변수 a는 값 그 자체를 가리킨다는 사람과 주 hyunsb.tistory.com 의문 primitve type은 Constant Pool에 있는 특정 상수를 참조하는 것이다. 그렇기에 int a = 1, int b = 1 인 경우 같은 주소를 참조하기 때문에 a==b 가 성립된다. 라는 정보를 보고 정말 그럴까? 값을 저장하는 것이 아닌가? 라는 의문이 생겨 해당 실험을 진행하게 되었습니다. int num = 1; 위의 코드는 정수형 변수 num에 1이라는 값을 저장하는 코드입니..
바인딩 (binding) 바인딩이란 컴퓨터 프로그램에서 각종 값들이 더 이상 변경되지 않는 값으로 구속 되는 것입니다. 풀어서 설명해보자면, 변수(식별자, identifier)가 각종 타입에 의해 데이터형이 확정되는것, 변수가 메모리 주소를 가리키거나 값을 가지는 것혹은 호출될 함수를 결정하는 것을 바인딩이라고 합니다. 바인딩은 컴파일 시에도 수행되고, 런타임 시에도 수행됩니다. 컴파일 과정에서 수행되는 바인딩을 정적(static) 바인딩이라고 하며, 런타임 과정에서 수행되는 바인딩을 동적(dynamic) 바인딩이라고 합니다. 정확하게는 ‘컴파일이나 런타임 과정에서 결정된다’ 라고 표현하는 게 맞는 것 같습니다. 정적 바인딩 (Static Binding) 컴파일 시에 결정되는 바인딩을 정적 바인딩이라고 ..
자바를 공부하다 보면 컴파일, 컴파일에러, 런타임 같은 단어를 많이 듣게 될 것입니다. 정적 바인딩과 동적 바인딩에 대해 공부하던 중 컴파일과 런타임을 알아야 이해가 되는 것들이 많아서 먼저 간단하게 이해하고 넘어가려 합니다. 이번 문서에서는 자바의 컴파일과 실행 과정을 알아보겠습니다. 우리가 열심히 java로 간단한 서비스 코드를 작성했습니다. 이후 이 소스코드를 실행시킨다고 생각해보죠, 우리의 코드는 어떤 과정에 의해 실행되는 걸까요? 우리의 소중한 소스 코드는 먼저 컴파일(compile) 되어야 합니다. 컴파일 (compile) 우리가 작성한 자바 코드는 .java 확장자로 저장됩니다. 이 자바 파일을 실행(Run)시키면 자바 컴파일러(javac)에 의해 자바 바이트코드로 작성된 .class 파일로..
코드의 배포와 재사용 ❓ 코드의 재사용이란 무엇일까요? 누군가 작성해놓은 소스코드를 복사해서 사용하는 것? 이것은 그냥 사용입니다. 그렇다면 재사용은 무엇일까요? 재사용은 우리가 작성한 코드가 아닌 이미 컴파일 된 바이트코드를 사용하는 것입니다. 그렇다면 내가 생성한 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..