날씨가 제법 따듯해졌다. 아니, 솔직히 말하자면 요즘 좀 덥다.
4월 중순인데 기온이 26도에 육박하니 이건 거의 초여름이 아닌가.
이번 주는 봄 같지 않은 날씨와 함께, Java 프로그래밍 언어를 배우고 있다.

학부때 내가 제일 많이 사용했던 언어는 Python이었다.
알고리즘이나 데이터 전처리라던가, ML, AI 등등 대부분의 것들을 파이썬으로 처리했다.
그래서 비교적 Python이 제일 익숙한 편이다.
컴퓨터 네트워크나 자료구조에 대해서 배울 때는 C언어를 기준으로 배웠었다.
직접 메모리를 관리하고 포인터를 다루면서 구조를 이해하는 과정이었다.
자바 언어는 학부 1학년 때 한 번 접해본 경험이 있다.
그런데... 놀랍게도 그 때의 기억이 완전히 소멸해버렸다.
그래서 작금의 나는 사실상 자바를 처음 배우는 사람이다.
그래서 문법이나 사용법 자체가 조금 생소한 면이 있다.
하지만 역시 프로그래밍 언어를 배우는 것은 전부 비슷하기 때문에 배우는 과정이 그렇게 크게 어색하지는 않다.
자료형을 배우고, 연산자를 배우고, 조건 분기를 배우고, 반복문을 배우고... 대부분의 언어 배움 과정과 다를 게 없다.
그럼에도 자바는 무언가 느낌이 다르다.
지금 Java를 배워가면서 느끼는 감상은... 뭐랄까 C와 Python의 중간에 있는 오묘한 느낌이 든다.

중간이라고 말하는건 조금 모호하긴 하다. 언어의 장단점이 혼재해 있다는게 더 정확하겠다.
파이썬에 익숙해진 나에게 오랜만에 느껴보는 타입 명시를 비롯한 C에 대한 불편함이 느껴진다.
가령 `int x = 10;` 처럼 명시적으로 타입을 선언한다던가, 중괄호 기반으로 블록 구조를 만든다던가. 컴파일 단계를 거쳐야 한다거나 말이다.
확실히 자바는 파이썬보다 훨씬 정적이고 엄격한 구조를 이룬다. 그래서 C 언어의 느낌이 난다.
하지만 자바는 C처럼 메모리를 직접적으로 다루지는 않는다.
대신 자동으로 메모리 관리를 도와주는 GC(Garbage Collector)를 사용한다.
자바는 포인터도 없어서 메모리에 직접 접근이 불가능하다.
대신 파이썬처럼 꽤나 많은 라이브러리를 갖고 있고, 객체 지향을 추구한다는 점.
엄격한 구조를 통해 안정성을 챙길수 있다는 점.
어느 정도 제어를 개발자에게 맡긴다는 점.
이런 점들을 생각하면 나쁘지많은 않은 언어다.
그래서 그런지 금융권에서 자바를 선호하는 경향이 있다고 한다.
그런 연유로 이번 포스팅은 자바의 문법보단, 왜 자바를 KB IT's Your Life 커리큘럼에 넣었는가를 생각하면서 작성했다.

Java의 플랫폼 독립성
Java의 핵심적인 강점은 "한 번 작성한 코드를 다른 운영체제에서도 실행시킬 수 있다" 는 점이다.
금융권은 서버, 배치시스템, 내부 업무 시스템, 외부 채널 시스템 등이 서로 다른 환경에서 구현되어 있다.
그래서 각 환경에 맞도록 코드 재해석하는 불편한 경우가 발생할 수 있다.
그런 불편한 점을 해결할 수 있는게 Java라는 것이다.
자바를 사용하면 `.java` 소스코드를 `javac` 컴파일러를 통해 바이트 코드를 생성한다. (.class)
그리고 해당 bytecode가 OS에 독립적인 코드가 되기 때문에 어느 곳에서든 동일한 코드를 사용할 수 있는 것이다.
물론 JVM(Java Virtual Machine)이 바이트 코드를 읽어 binary 코드로 재해석해야 한다.
그리고 JIT 컴파일러를 이용해 성능을 최적화해주는 과정을 거쳐야 한다.
사실 자바의 플랫폼 독립적이라는 매커니즘은 바이트코드에 한정해서 들어간다.
JDK나 JVM은 OS에 종속적이라는 한계도 존재한다.
그럼에도 바이트코드를 실행시킨다는 목적 하나만 성공시키면 되기 때문에 C에 비해서 훨씬 이식성이 좋다고 말하는 것이다.
바이트코드가 일종의 밀키트 역할이라고 봐도 되겠다.

Java의 높은 신뢰성
은행 시스템은 언제나 높은 신뢰성을 요구한다.
금융 시스템에 약간의 장애가 발생하는 순간에 곧바로 금전 손실이나 신뢰도 하락으로 이어질 수 있기 때문이다.
내가 ATM 기계로 계좌로 돈을 이체하는 순간에, 장애가 발생해서 돈은 빠져나가고 계좌에 입금이 되지 않는 일이 생긴다면...

물론 이 예시는 데이터베이스의 트랜젝션 설계 문제에 가깝다(ACID).
자바가 직접 트랜젝션을 보장하는 것이 아니라, 그것이 깨지지 않도록 구현하기 쉬운 환경을 제공하는 것이다.
자바는 타입을 엄격하게 관리하는 시스템이기 때문에 잘못된 타입 전달을 방지하고, 컴파일 단계에서 오류를 사전에 차단해준다.
잘못된 값이 들어오는 것 자체를 없애야하는 금융권에서 중요한 속성이라고 할 수 있다.
마찬가지로 자바는 예외 처리 구조를 명시적으로 처리하도록 구조화시킨다.
그래서 실패나 예외 상황에서 이벤트 처리를 무시하기 어렵게 되어있다.
나중에는 백엔드를 위해서 Spring Framework를 같이 사용하게 된다.
이 때는 `@Transactional` 와 같이 추상화된 트랜젝션 가져다가 쓸 수 있어서 개발자가 안전한 방식을 쉽게 사용하도록 만든다.
마찬가지로 잘못된 구현 자체를 구조적으로 어렵게 만들어준다.
@Transactional
public void transfer() {
withdraw();
deposit();
}
위처럼 코드를 작성하면, 개발자가 Transaction에 대해서 commit과 rollback 분기나 Exception 관리를 빼먹는 실수를 구조적으로 차단해준다.
모두가 두려워하는 사소한 실수를 사전에 막아줄 수 있게 해주는 것이다.
Java의 멀티 스레딩

은행 앱은 역시 동시에 많은 사용자들의 요청을 처리해야 한다.
어떤 사용자는 서버에 로그인을 할 것이고, 어떤 사람은 계좌를 조회하고, 어떤 사람은 돈을 이체하고, 누구는 계좌를 개설한다.
이러한 작업들을 처리할 때, 단일 스레드를 사용하면 당연히 답답하고 오랜 시간이 들어간다.
이럴 때 보통 병렬 처리를 위해 멀티 스레딩을 구현하게 된다.
자바에서는 언어와 표준 라이브러리 차원에서 스레드와 동시성(Concurrency) 제어, 실행자 프레임워크 등을 지원하기 때문에 서버 애플리케이션에 적합하다.
물론 이 병렬처리는 다른 언어들도 가능해서 자바만의 독특한 성질은 아니다.
보안성과 유지보수
자바에서 타입의 강제와 함께 메모리 직접 접근을 제한하는 특징이 있다.
C에서는 포인터를 활용해서 메모리에 직접 접근하고, malloc/free 를 통해 메모리를 동적으로 관리한다.
학부 자료구조 수업 시간에 C언어를 통해 열심히 구현했던 기억이 난다.
이 방식은 꽤나 개발자가 유연하게 사용할 수 있도록 제어권을 맡긴 것이다.

하지만 항상 골치가 아팠던 것은, 결국 메모리 관리는 어렵고 복잡하다는 것이다.
포인터 접근을 잘못해서 메모리를 오염시키거나, free를 누락해서 메모리 누수를 발생시키거나.
혹은 이미 해제시킨 메모리를 또 참조하는 괴상한 짓을 벌이기도 했다.
하지만 자바에서는 C에서 제공했던 저수준 제어권을 넘겨주지 않는다.
우리들은 포인터를 직접 다루지 못하고, 객체는 항상 JVM이 관리하는 Heap 영역에 생성된다.
메모리 해제 또한 GC(Garbage Collector) 에게 맡겨버리면서 참조되지 않은 객체를 자동으로 회수하게 만들어준다.

자바는 이런 방식으로 메모리 누수나 잘못된 메모리 주소 접근같은 문제를 구조적으로 최소화시켜준다.
또한, 자바가 가지고 있는 강타입 시스템은 잘못된 데이터 사용을 컴파일 단계에서 차단해준다.
타입이 맞지 않는 값은 애초에 실행조차 되지 않도록 만들어서 런타임에서 발생할 오류를 많은 부분에서 예방해준다.
금융 시스템은 데이터의 정확성이 굉장히 중요하기 때문에 이런 특징이 큰 장점으로 작용하게 된다.
이러한 일련의 구조들과 환경, 제약들이 시스템의 전반적인 안정성과 보안성을 높이기 위해서 설계된 것이라고 보면 된다.
마찬가지로 이런 특징은 유지보수 측면에서도 유리하게 동작한다.
메모리 관리를 자동으로 처리하니 코드를 복잡하게 쓸 필요가 없어진다.
특정 기능을 수정하려고 할 때 메모리 해제나 참조 관리와 같이 복잡한 문제를 고려하지 않아도 되기 때문이다.
여기에 객체지향 구조와 함께 명확한 타입 시스템까지 합쳐지면서, 처음 보는 개발자도 해당 코드가 무엇을 하는지 쉽게 알아볼 수 있고 사용하기도 편해진다는 것.
이 얼마나 관대한 언어인가.
그렇게 이번 주는 완전히 자바 프로그래밍을 익히는데 전부 투자하고 있다.
자바의 꽃은 아무래도 클래스와 상속, 인터페이스와 구현과 같이 추상화 및 구현 분리 과정이겠다.
자바의 기본 단위인 클래스가 이루어지는 방법. 클래스를 서로 상속하는 관계.
그리고 인터페이스 기반 설계를 통해 동작 및 구현 분리 과정은 다른 언어에서 쉽게 접하지 못한 경험이다.
다른 언어들처럼 하나의 코드가 다른 코드에 의존하는 관계가 아니라, 서로 조합되는 관계 (Composition) 로 짜여진다는 것이 개인적으로 마음에 든다.
제대로 자바를 이해하려면 아직 먼 길을 걸어야 하겠지만, 자바는 생각보다 재미있는 언어라는 인식을 주는 일주일이었다.

'개발 > KB IT's Your Life 7기' 카테고리의 다른 글
| KB IT's Your Life 7기 - Java 프로그래밍 2 (0) | 2026.05.10 |
|---|---|
| KB IT's Your Life 7기 - Git 좀 더 잘 써보기 (0) | 2026.05.01 |
| KB IT's Your Life 7기 - 스켈레톤 프로젝트 후기 (1) | 2026.04.19 |
| KB IT's Your Life 7기 - 프론트엔드 교육을 들으며 (0) | 2026.04.11 |
| KB IT's Your Life 7기 - Git/GitHub 친해지기 (1) | 2026.04.05 |