Call by value - 값에 의한 호출 - 전달받은 값을 복사하여 처리하며, 전달받은 값을 변경해도 원본이 변경되지 않는다. - 복사된 변수는 메서드 내부에서 지역적으로만 사용된다. Call by reference - 참조에 의한 호출 - 전달받은 값을 직접 참조하며, 전달받은 값을 변경하면 원본도 같이 변경된다. 우리가 자바를 쓰다보면 메서드의 매개변수로 객체를 넘기고, 메서드 내부에서 객체를 수정했을 때 원본 객체의 값도 같이 변경되는 것을 항상 볼 수 있다. 즉, 자바는 메서드 내부에서 객체를 변경했을 때 원본 객체도 같이 변경되니 Call by reference가 이뤄지는 것일까? 정답은 아니다! 자바에서는 매개변수로 객체를 넘길 때, 객체의 주소 값을 복사해서 넘기기 때문에 원본 객체의 수..
# 함수형 프로그래밍? 함수형 프로그래밍은 객체지향 프로그래밍과 같은 프로그래밍 패러다임 중 하나이다. 1. 불변 (Immutability) - 불변인 함수는 부수 효과(Side Effect)가 없다. - 불변이기에 같은 값을 넣으면 항상 같은 값을 준다는 것을 보장할 수 있다. - 불변이기에 상태를 갖지 않는다. 상태를 갖지 않기에 병렬처리에 유리하다. (교착상태에 빠지지 않는다) - 이렇게 외부 환경에 영향을 받지 않는 함수를 함수형 프로그래밍에서 "순수 함수 (Pure function)" 이라고 불러준다. (+) 왜 교착상태에 빠지지 않나? 불변인 함수는 같은 값을 넣으면 같은 값을 준다는 것을 보장한다고 했다. 또한 상태를 갖지 않는다. 그 얘기인 즉슨 여러 스레드가 동시에 같은 함수를 이용해도 ..
문득 궁금해졌다. 왜 inner class로는 static class가 가능한데, outer class에는 static이 오는 것이 불가능할까? * 제일 바깥의 클래스, top-level class를 얘기하는 것 public static class OuterClass { // (X) public static class InnerClass { // (O) } } static을 왜 쓰는지, static의 특징이 무엇인지부터 알아야 한다.. 1. static 키워드가 붙은 멤버(메서드/변수)는 모든 인스턴스가 공유해서 사용하도록 하기 위해 사용되어진다. -> 특정 인스턴스에 종속되어있는 것이 아니다. 2. static 멤버에 접근하기 위해 인스턴스를 생성하지 않아도 된다. - 클래스 이름과 점( . ) 을 이..
# 주의 # 뇌피셜, 개인적인 생각이 상당부분 포함되어 있고 글도 상당히 뒤죽박죽입니다. 또 틀린 부분이 있을지도 모릅니다. 무엇보다 굉장히 장문이라 1줄짜리 정의를 원하는 사람에게 적합하지 않습니다 객체지향(Object Oriented Programming, OOP). 객체를 지향한다. 객체가 뭔가? 그 답은 클래스가 뭔가? 에서부터 출발한다. 클래스는 대개 객체를 정의하는 설계도 또는 틀으로 객체를 생성하는데 사용된다고 흔히 이야기 한다. "붕어빵 틀은 클래스이고 붕어빵 틀로 찍어낸 붕어빵들이 객체" 라는 설명은 객체지향을 공부한 사람이라면 반드시 한번쯤은 들어봤을 설명이다. 여기서 특별히 한 클래스를 통해 생성된 객체를 찝어서 해당 클래스의 인스턴스(Instance)라고 부르기로 한다. 인스턴스랑 ..
자바 언어는 JVM(Java Virtual Machine)을 사용해 플랫폼에 독립적인 개발을 가능하게끔 해준다 (Write Once, Run Anywhere) JVM - JRE(Java Runtime Enviroment) - JDK(Java Development Kit) 순서로 포함되어 있는 구조를 갖게된다. JVM이 그만큼 핵심이라는것. 그럼 자바 코드는 어떤 식으로 실행되는 것일까? # 바이트 코드란? - 고급 언어로 작성된 코드를 JVM이 이해할 수 있는 언어로 변환된 코드 - 명령어 크기가 1바이트라서 바이트 코드라고 불린다. # 왜 바이트 코드가 필요할까? 고급 언어에서 기계어로 바로 바꾸면 안될까? -> 바이트코드는 가상머신(JVM)에서 돌아가는 프로그램을 위한 언어 표기법이다. -> 같은 p..
* 이펙티브 자바 2/E를 읽고 공부하기 위해 기록한 게시글입니다. 45. 지역변수의 유효범위를 최소화하라 * 메서드의 크기를 줄이고 특정한 기능에 집중하라. - 두 가지 서로 다른 기능을 한 메서드 안에 넣어두면 한 가지 기능을 수행하는데 필요한 지역 변수의 유효범위가 다른 기능까지 확장되는 문제가 발생한다. 이러한 문제를 막기 위해서는 각 기능을 나눠 별도 메서드로 구현하라.(SRP) * 지역변수의 유효범위를 최소화하는 가장 강력한 기법은, 처음으로 사용하는 곳에서 선언하는 것이다. - 사용하기 전에 선언하는 것은 코드를 읽는 사람만 혼란스럽게 만든다. - 지역변수를 너무 빨리 선언하면 유효범위가 너무 앞뒷쪽으로 확장되게 된다. 지역변수의 유효범위는 선언된 지점으로부터 해당 블록 끝까지다. 어떤 블록..
* 이펙티브 자바 2/E를 읽고 공부하기 위해 기록한 게시글입니다. 43. null보다는 빈 배열이나 컬렉션을 반환하라 빈 배열이나 컬렉션을 반환하는 대신 null을 반환하는 메서드를 사용하게 되면 오류가 발생하기 쉽다. - 클라이언트가 null 처리 과정을 빼먹을 수도 있기 때문. - null을 반환하는 메서드는 상대적으로 구현하기도 더 까다롭다. 배열 할당 비용을 피할 수 있으니 null을 반환하는 것이 좋다는 주장은 틀린 부분이 있다 1. 성능 걱정을 할 정도의 수준이 아니다. 2. 길이가 0인 배열은 변경이 불가능하므로 아무 제약없이 재사용할 수 있다. 그리고 책이 오래되서 그런건지 모르겠는데 개인적으로는 이런 경우에 Optional을 쓰는것이 좋지 않나? 생각이 들기도 한다. Optional에 ..
* 이펙티브 자바 2/E를 읽고 공부하기 위해 기록한 게시글입니다. 41. 오버로딩 할 때는 주의하라 메서드가 오버로딩(Overloading)되면 어떤 메서드가 호출될 지는 컴파일 시점에 정적으로 결정된다. 반면 오버라이딩(Overriding)된 메서드는 런타임 중에 동적으로 결정된다. 오버로딩은 메서드 이름은 동일하되 그 이외의 메서드 시그니처(리턴타입이나 파라미터 정보)를 달리 설정하는 것 - 컴파일 시점에 어느 메서드를 실행할 지 선택한다. - 리턴값만 다른 오버로딩 메서드는 만들 수 없다 public class EffectiveJava { public static String classify(LinkedList list) { return "LinkedList"; } public static Str..