자바 입문자가 헷갈리는 문법과 객체지향 개념을 ‘코드가 실행되는 순서’라는 관점에서 풀어낸 글

퇴근 후 거실 소파에 앉아 있던 한 중년 신입사원이 있었다. 그는 새로 배우기 시작한 프로그래밍 언어의 첫 장벽에 부딪혔다. 책에는 “클래스는 객체의 청사진이다”라고 적혀 있었지만, 막상 직접 코드를 작성하려니 어디서부터 시작해야 할지 막막했다. 그가 작성한 첫 코드는 화면에 아무 것도 출력하지 못했고, 단지 빨간색 오류 메시지만 쏟아냈다. 순서가 잘못되었던 것이다. 프로그래밍은 결국 ‘누가 먼저 실행되는가’의 연속이다. 우리가 일상에서 요리법을 따라 할 때 재료 손질 순서를 바꾸면 요리가 망가지듯, 자바도 코드가 실행되는 순서를 이해해야 비로소 길이 보인다.

글을 시작하며, 프로그래밍 학습에서 가장 큰 혼란은 용어가 아니라 실행 흐름의 혼선에서 온다는 점을 짚고 싶다. 자바는 컴파일 언어라서 작성한 소스 파일이 곧바로 실행되지 않는다. 중간에 번역 단계를 거쳐 기계어로 바뀐 뒤에야 프로그램으로서 움직인다. 이 과정을 이해하지 못하면 문법을 아무리 외워도 어디서부터 문제가 생겼는지 알기 어렵다.

먼저 개발 환경을 구성하는 순서부터 살펴보자. 자바로 첫발을 내딛는 사람에게 필요한 것은 크게 두 가지다. 하나는 소스 코드를 작성할 편집기이고, 다른 하나는 작성한 코드를 기계어로 바꿔 줄 컴파일러다. 편집기에는 메모장부터 시작해 다양한 도구가 있지만, 중장년 학습자에게는 화면이 단순하고 한글 지원이 원활한 도구를 선택하는 것이 유리하다. 컴파일러는 JDK라고 부르는 패키지에 포함되어 있다. 설치 과정에서 주의할 점은 환경 변수 설정인데, 이는 컴퓨터가 자바 명령어를 어디서 찾을지 알려주는 길잡이 역할을 한다. 설치는 보통 10분이면 끝나지만, 많은 초보자가 이 단계에서 길을 잃는다. 그러나 겁먹을 필요는 없다. 명령 프롬프트나 터미널에 간단한 버전 확인 명령어를 입력해 정상 설치 여부를 점검하는 것만으로도 절반은 성공한 셈이다.

이제 본격적으로 코드가 실행되는 순서를 따라가 보자. 자바 프로그램의 시작점은 항상 main 메서드다. 어떤 클래스가 먼저 오든, 어떤 변수가 선언되어 있든, 프로그램이 실행되면 JVM은 main 메서드를 찾아 그 첫 줄부터 차례대로 읽어 내려간다. 이 지점을 이해하면 많은 혼란이 풀린다. 예를 들어 클래스 안에 여러 메서드를 정의해 두었더라도 main 메서드가 그 메서드들을 호출하지 않으면 실제로 실행되지 않는다. 마치 책의 목차와 본문의 관계와 같다. 목차에 제목이 있다고 해서 그 페이지가 저절로 펼쳐지지 않는 것처럼, 호출이라는 행위가 있어야 코드가 움직이기 시작한다.

객체지향 개념도 같은 관점에서 바라볼 수 있다. 클래스는 설계도일 뿐이고, new 키워드를 사용해 인스턴스를 생성하는 순간부터 실제 데이터가 메모리에 자리 잡는다. 생성자는 인스턴스가 태어날 때 가장 먼저 실행되는 특별한 메서드다. 생성자가 먼저 실행되고 나서야 객체의 다른 메서드를 호출할 수 있다. 이 순서를 거꾸로 생각하면 자바 입문자가 자주 저지르는 실수를 하게 된다. 객체를 만들지 않고 클래스의 메서드를 직접 호출하려다가 오류를 만나는 것이다.

자바 기초 문법 중에서도 변수의 종류와 저장 위치는 실행 순서와 깊은 관련이 있다. 클래스 안에 선언된 변수는 객체가 생성될 때 메모리에 올라가고, 메서드 안에 선언된 지역 변수는 메서드가 호출될 때만 잠시 존재한다. 메서드 호출이 끝나면 지역 변수는 사라진다. 이 개념을 이해하면 메서드 간에 값을 주고받는 방식이 자연스럽게 보인다. 값이 사라지기 전에 다른 메서드로 전달하거나 결과로 돌려주는 것이다. 프로그램의 실행 흐름은 결국 데이터가 어디에 있고 언제 사라지는지에 대한 통제라 해도 과언이 아니다.

자바 입문자를 위한 콘솔 프로젝트를 하나 예로 들어 보자. 간단한 계산기 프로그램을 만든다고 가정할 때, 프로그램의 실행 순서는 다음과 같은 흐름을 갖는다. 첫째, 사용자에게 어떤 연산을 수행할지 안내하는 문구를 출력한다. 둘째, 키보드 입력을 받아 변수에 저장한다. 셋째, 저장된 값을 바탕으로 조건문을 실행해 해당하는 연산을 수행한다. 넷째, 결과를 화면에 출력한다. 이 네 단계의 순서가 바뀌지 않도록 코드를 작성하는 것이 핵심이다. 아무리 화려한 기능을 넣어도 순서가 꼬이면 프로그램은 사용자가 기대하는 동작을 하지 않는다. 오히려 단순하게 시작해 각 단계의 흐름을 눈으로 확인하는 편이 학습 속도를 높인다.

자바에서 자주 사용되는 자료구조도 실행 순서의 관점에서 접근하면 이해가 빠르다. 배열은 크기가 고정된 연속된 공간이고, 리스트 계열은 크기가 유동적으로 늘어나는 구조다. 저장과 조회의 순서가 자료구조의 성격을 결정한다. 스택은 마지막에 넣은 값을 먼저 꺼내고, 큐는 먼저 넣은 값을 먼저 꺼낸다. 어떤 작업을 먼저 처리할 것인지에 따라 적절한 자료구조가 달라진다. 자바에서는 컬렉션 프레임워크라는 이름으로 다양한 자료구조를 제공한다. 입문 단계에서는 이름을 외우기보다 각 구조가 데이터를 넣고 빼는 순서가 어떻게 다른지 관찰하는 것이 중요하다.

예외 처리와 디버깅 또한 실행 순서를 이해하면 훨씬 수월해진다. 예외란 프로그램이 정상적으로 실행되는 흐름을 방해하는 사건을 말한다. 예를 들어 사용자가 숫자 대신 문자를 입력했을 때, 프로그램은 그 순간 실행을 멈추고 예외를 던진다. 이때 예외 처리 구문을 사용하면 프로그램이 완전히 종료되지 않고 다음 단계로 진행할 수 있다. 디버깅은 실행 중간에 잠시 멈추고 변수의 값을 확인하는 작업이다. 코드가 어느 지점까지 실행되었는지를 따라가며 문제의 원인을 찾는다. 이 모든 과정은 결국 ‘지금 어느 줄이 실행 중인가’를 확인하는 행위다.

미래 전망을 이야기하자면, 자바는 수년째 산업 전반에서 꾸준히 사용되는 언어다. 금융 시스템, 대규모 기업용 애플리케이션, 안드로이드 앱까지 다양한 영역에서 자바가 동작하고 있다. 새로운 언어들이 등장하고 있지만 기존 시스템이 자바로 구축되어 있는 한 유지보수 인력의 수요는 이어질 것으로 보인다. 중장년이 새로 배우기에 자바는 결코 늦은 선택이 아니다. 다만 모든 언어 학습이 그렇듯, 처음부터 완벽하려고 애쓰기보다 작은 프로그램을 완성해 보는 경험이 더 중요하다.

실행 방안을 구체적으로 제안하면, 첫째 주에는 개발 환경을 설치하고 한 줄 출력 프로그램을 완성한다. 둘째 주에는 변수와 자료형을 다루며 입력값을 받아 출력하는 과정을 익힌다. 셋째 주에는 조건문과 반복문을 이용해 프로그램의 흐름을 제어해 본다. 넷째 주부터는 간단한 콘솔 프로젝트를 하나씩 완성하면서 객체지향 개념을 적용한다. 이 기간 동안 중요한 것은 하루에 조금씩이라도 코드를 직접 작성하는 습관이다. 손으로 직접 타이핑해야 실행 순서에 대한 감각이 몸에 밴다.

자바 학습의 핵심은 암기가 아니라 실행 흐름을 시각화하는 능력이다. 코드가 위에서 아래로 흐르고, 메서드 호출로 다른 흐름으로 점프하고, 조건문으로 갈림길을 만나고, 반복문으로 같은 길을 다시 걷는다. 이 흐름을 머릿속에서 그릴 수 있게 되면 문법의 세부 사항이 조금 헷갈려도 프로그램 전체를 이해할 수 있다. 나이가 들어 새 언어를 배우는 일이 부담스러울 수 있지만, 일상생활에서 순서를 따지는 능력은 이미 오랜 경험으로 익숙하다. 그 경험을 코드에 그대로 적용하면 생각보다 빠르게 자바의 세계로 들어설 수 있다. 시작은 느리더라도 매일 조금씩 흐름을 따라가는 연습을 이어가길 권한다.