static, 언제 쓰고 언제 피해야 할까
·
Java
자바를 처음 배우면 static 키워드가 참 매력적으로 보입니다.객체를 new로 만들 필요 없이 클래스 이름만으로 메서드를 호출하거나 변수에 접근할 수 있기 때문입니다."전역 변수나 전역 함수처럼 쓰기 너무 편한데, 왜 다들 static을 남용하지 말라고 할까?"이 질문에 답하려면 static이 메모리의 어디에 저장되는지, 어떻게 동작하는지, 그리고 왜 객체지향 설계와 충돌하는지를 이해해야 합니다.static은 어디에 저장되는가자바 애플리케이션이 실행될 때 JVM은 메모리를 여러 영역으로 나눕니다. 그중 static과 관련된 핵심 영역은 Method Area입니다. Java 8 이후로는 이 영역의 구현이 Metaspace로 바뀌었습니다.영역저장되는 것수명Method Area (Metaspace)클래스 메..
접근 제어자가 설계를 어떻게 강제하는가
·
Java
"그냥 전부 public으로 하면 어디서든 쓸 수 있어서 편하지 않나?"실제로 전부 public으로 해도 컴파일은 됩니다. 동작도 합니다.// 모든 필드가 public인 상품 엔티티public class Product { public Long id; public String name; public int price; public int stock; public Product() {} // 누구나 빈 객체를 만들 수 있다}이 코드의 문제는 아무 곳에서나 아무 값을 넣을 수 있다는 점입니다.Product product = new Product();product.stock = -100; // 재고가 마이너스?product.price = 0; // 가격이 0원?produ..
자바를 객체지향이라고 부르는 네 가지 이유
·
Java
자바를 객체지향 언어라고 부르는 건 단순히 클래스를 쓴다는 의미가 아닙니다. 자바가 뒷받침하는 네 가지 개념이 있기 때문입니다.추상화 (Abstraction): 복잡한 내부를 감추고 필요한 부분만 외부로 노출합니다.캡슐화 (Encapsulation): 데이터와 동작을 한 객체에 묶고 외부에서 직접 손대지 못하게 막습니다.상속 (Inheritance): 공통 코드를 부모-자식 관계로 재사용합니다.다형성 (Polymorphism): 같은 호출 코드가 객체의 실제 타입에 따라 다른 동작을 하게 만듭니다.이 네 가지는 따로따로 동작하는 게 아니라 서로 맞물려 객체지향 코드의 형태를 만듭니다.이 글에서는 각각이 무엇이고, 코드에서 어떻게 드러나는지 짚어봅니다.절차지향과 무엇이 다른가객체지향 이전엔 절차지향이 주류..
왜 자바엔 인터페이스와 추상 클래스가 둘 다 있을까
·
Java
자바를 배우다 보면 어떤 메서드는 구현하고 어떤 메서드는 비워둔 클래스 두 종류를 만납니다.interface Flyable { void fly(); // 구현 없음}abstract class Animal { abstract void speak(); // 구현 없음 void breathe() { // 구현 있음 System.out.println("숨을 쉰다"); }}둘 다 직접 인스턴스를 만들 수 없는 추상화 도구지만, 역할과 사용 시나리오는 다릅니다.이 글에서는 두 도구의 문법적 차이, 언제 어느 쪽을 골라야 하는지, Java 8 default 메서드로 흐려진 경계까지 짚어봅니다.인터페이스인터페이스는 어떤 능력을 가진다는 약속입니다..
오버로딩 vs 오버라이딩, 컴파일러가 결정할까 JVM이 결정할까
·
Java
자바 코드를 읽다 보면 같은 이름의 메서드를 자주 만납니다. 그런데 자세히 보면 두 가지 종류가 섞여 있습니다.class Calculator { int add(int a, int b) { return a + b; } double add(double a, double b) { return a + b; } // 같은 이름, 다른 매개변수}class Animal { void speak() { System.out.println("..."); }}class Dog extends Animal { @Override void speak() { System.out.println("멍"); } // 부모 메서드를 다시 정의}위 두 패턴을 각각 오버로딩(Overloading) 과 오버라이딩..
자바는 Call by Value인가 Call by Reference인가
·
Java
자바를 어느 정도 익히고 나면 한 번쯤 이 질문에 부딪힙니다."자바는 Call by Value인가요, Call by Reference인가요?"답을 "Reference"라고 하면 거의 맞지만 정확히는 틀린, 헷갈리기 쉬운 주제입니다.결론부터 말하면 자바는 Call by Value 한 가지뿐입니다. 그런데 왜 객체를 메서드에 넘기면 원본이 바뀌는 것처럼 보일까요?이 글에서는 두 개념의 차이부터 자바가 어떤 방식인지 짚어봅니다.Call by Value vs Call by Reference두 용어는 함수에 인자를 어떻게 전달하느냐에 대한 방식입니다.방식전달되는 것함수 안 변경이 원본에 영향?Call by Value값을 복사해서 전달영향 없음 (별개의 복사본)Call by Reference변수 자체(메모리상 위치..
변수 스코프와 생명주기 - 자바 변수가 어디서 살고 어디서 사라지는지?
·
Java
자바 코드를 짜다 보면 같은 변수 선언이지만 어떤 위치에서 했느냐에 따라 동작이 완전히 달라집니다.int x = 10;메서드 안에 두면 → 메서드 끝나면 사라짐클래스 안에 두면 → 객체가 살아 있는 동안 유지static을 붙이면 → 프로그램 전체 동안 유지이 차이를 만드는 두 개념이 스코프(Scope, 접근 범위)와 생명주기(Lifetime, 메모리 거주 시간)입니다.변수 스코프스코프(Scope)는 변수가 어디서 접근 가능한지를 결정하는 범위입니다. 자바는 블록 스코프 방식을 씁니다.{} 안에서 선언한 변수는 그 {} 안에서만 접근할 수 있습니다.void example() { int outer = 1; // 메서드 블록 스코프 if (outer > 0) { int ..
int vs Integer 왜 자바엔 두 가지 정수 타입이 있을까
·
Java
자바를 배우다 보면 정수 타입이 두 가지인 걸 발견합니다.int x = 10;Integer y = 10;int만으로 충분할 것 같은데, 왜 Integer가 따로 있을까요? 그리고 둘은 정확히 어떻게 다를까요?지난 편에서 봤듯이 int는 Primitive 타입이고 Integer는 그 짝이 되는 Wrapper 클래스(Reference 타입)입니다.메모리 저장 방식이 다른 건 이미 짚었으니, 이번엔 왜 Wrapper가 존재하고 어떻게 써야 하는지에 초점을 맞춰봅니다.왜 Wrapper 클래스가 필요한가자바 초기엔 Primitive만 있었어도 충분했을 수 있습니다.그런데 자바가 발전하면서 Primitive로는 해결할 수 없는 상황이 생겼고, 그래서 Wrapper 클래스가 도입됐습니다.1. 제네릭은 Referenc..
Primitive vs Reference 자바 변수가 메모리에 저장되는 두 가지 방식
·
Java
자바를 처음 배울 때 보통 이런 코드부터 만납니다.int x = 10;String s = "hi";겉보기엔 비슷한 변수 선언이지만, 메모리에 저장되는 방식은 다릅니다. 그 차이를 모르면 나중에 == 비교가 이상한 결과를 내거나, 메서드에 객체를 넘겼는데 원본이 바뀌는 같은 혼란이 생깁니다.이 글에서는 자바의 두 가지 타입(Primitive(원시) 와 Reference(참조))이 메모리에 어떻게 다르게 저장되고, 그 차이가 실제 코드에 어떤 영향을 주는지 짚어봅니다.Primitive 타입자바에는 8가지 원시 타입이 있습니다. 미리 정해진 크기의 값 자체를 변수에 저장합니다.타입크기기본값표현 범위 또는 예boolean1 bitfalsetrue / falsebyte1 byte0-128 ~ 127short2 b..
JVM 메모리 영역 입문 [Stack, Heap, Method Area]의 역할 분담
·
Java
자바 코드 한 줄을 실행하는 동안 변수와 객체와 클래스 정보가 서로 다른 곳에서 산다는 사실, 의식해 본 적 있나요?public class Counter { static int total = 0; // 어딘가에 저장됨 int count = 0; // 또 다른 어딘가 void increment() { int delta = 1; // 또 다른 어딘가 count += delta; total += delta; }}한 클래스 안의 세 변수 total, count, delta는 메모리에서 각자 다른 영역에 저장됩니다. 자바 메모리 모델은 앞으로 Primitive 타입과 Reference 타입의 차이, Ca..