기본 콘텐츠로 건너뛰기

방송대 Java프로그래밍 1강: 바이트코드 실행 구조와 객체지향의 출발

Java프로그래밍 1강 - Java와 객체지향 프로그래밍

방송대 Java프로그래밍 1강: 바이트코드 실행 구조와 객체지향의 출발

같은 Java 소스가 서로 다른 운영체제에서 실행될 수 있는 까닭은 소스 파일 자체가 곧바로 실행되기 때문이 아니다. 컴파일러가 만든 바이트코드와 운영체제별 Java VM이 중간에서 역할을 나누기 때문이다. 이 흐름을 따라가면 JDK·Java 플랫폼·Eclipse의 차이, main()의 위치, 클래스와 객체의 관계까지 하나의 개발 과정으로 설명할 수 있다.

Hello.java는 왜 바로 실행되지 않을까

학습을 위해 Hello.java라는 소스 파일을 작성했다고 가정하자. 사람이 읽는 이 소스는 먼저 Java 컴파일러를 거쳐 Hello.class라는 바이트코드로 변환된다. 그다음 Java VM이 바이트코드를 읽고 실제 컴퓨터에서 프로그램을 실행한다.

실행 흐름: .java 소스 파일 → 컴파일러 → .class 바이트코드 → Java VM → 실행 결과 순서로 추적한다.

여기서 파일 확장자는 처리 단계를 알려 주는 표지다. .java는 개발자가 작성한 원본이고, .class는 Java VM에서 실행할 수 있도록 컴파일된 결과다. 따라서 java Hello.javajava Hello를 같은 의미로 외우면 실행 단계가 섞인다. 강의의 명령 프롬프트 방식에서는 javac Hello.java로 컴파일한 뒤 java Hello로 실행한다.

javac Hello.java
java Hello

첫 줄은 소스를 바이트코드로 바꾸고, 둘째 줄은 클래스 이름을 Java 실행기에 전달한다. 실행 명령에서 .class 확장자를 붙이지 않는 점도 구분해야 한다.

플랫폼 독립성은 바이트코드와 Java VM의 역할 분담에서 나온다

일반적인 기계어 프로그램은 운영체제와 하드웨어 환경에 직접 맞춰진다. Java는 중간 형태인 바이트코드를 만들고, 각 운영체제에 맞는 Java 플랫폼이 이를 실행하도록 설계한다. 개발자는 같은 바이트코드를 사용할 수 있지만, 실행할 컴퓨터에는 그 운영체제에 맞는 Java 플랫폼이 설치되어 있어야 한다.

단계담당 요소입력출력·역할
작성텍스트 편집기 또는 IDE프로그램 설계.java 소스 파일
컴파일Java 컴파일러.java.class 바이트코드
실행Java VM바이트코드현재 운영체제에서 프로그램 구동

Java VM은 Java 프로그램의 실행 환경을 제공하는 가상 기계이자 구동 엔진이다. 실행에 필요한 사항과 메모리 정리 등을 관리한다. Java API는 프로그램 개발에 필요한 클래스 라이브러리이며, 관련 클래스들은 패키지라는 계층 구조로 분류된다. Java VM이 “코드를 어떻게 실행할 것인가”에 가깝다면 Java API는 “프로그램을 만들 때 어떤 기능을 가져다 쓸 것인가”에 가깝다.

플랫폼 독립성을 “아무 설치 없이 모든 컴퓨터에서 실행된다”로 이해하면 틀린다. 동일한 바이트코드를 활용할 수 있다는 뜻이며, 각 운영체제에 맞는 Java 실행 환경은 필요하다.

Java의 특징은 실행 구조와 프로그래밍 방식으로 나누어 읽는다

Java는 운영체제와 하드웨어 플랫폼에 대한 독립성을 지향하며, 클래스 중심의 객체지향 프로그래밍을 지원한다. 데스크톱 응용뿐 아니라 웹·네트워크 프로그램 작성에 활용할 수 있고, 변수 사용에서 엄격한 자료형 검사를 수행한다. 예외 처리 기능과 멀티스레딩 지원도 언어의 주요 특징이다.

관점특징학습할 때의 질문
실행 환경운영체제와 하드웨어에 대한 독립성바이트코드를 어떤 Java VM이 실행하는가?
프로그램 구조객체지향, 클래스가 기본 구성 단위데이터와 기능이 어느 클래스에 묶이는가?
오류 예방엄격한 자료형 검사, 예외 처리값의 종류와 실패 상황을 어떻게 다루는가?
동시 작업멀티스레딩 지원여러 실행 흐름을 어떻게 구성하는가?

이 특징들은 서로 고립된 목록이 아니다. 컴파일 단계의 자료형 검사는 잘못된 값 사용을 일찍 발견하도록 돕고, Java VM은 바이트코드의 실행 환경을 제공하며, 클래스는 상태와 행위를 한 단위로 조직하게 한다.

Oak에서 Java로 이어진 변화는 적용 범위의 확장을 보여 준다

강의자료의 연혁에 따르면 Java의 출발점은 Sun Microsystems의 제임스 고슬링이 참여한 1990년 Green 프로젝트와 Oak 언어다. 1995년 Java와 HotJava가 발표되면서 웹의 확산과 함께 주목받았고, 1996년 1월 JDK 1.0이 발표되었다.

시점강의자료의 주요 사건흐름에서 읽을 의미
1990년Green 프로젝트와 Oak 언어Java로 이어지는 출발점
1995년Java와 HotJava 발표웹 확산과 함께 관심 확대
1996년 1월JDK 1.0 발표개발 플랫폼의 초기 공개
1998년Java2 SDK, SE 1.2강의자료에서 Java2 명칭의 시작으로 제시
2009년Oracle의 Sun 인수관리 주체의 변화
2014년·2023년Java Platform(JDK) SE 8·Java SE 21 발표강의 설치 예시로 이어지는 버전 흐름

연도 자체만 외우기보다 Oak라는 전신, Java 이름의 공개, JDK 플랫폼의 발표가 어떤 순서로 이어지는지 묶어 기억하면 된다. 이 글의 설치 경로와 버전 설명은 강의자료가 제시한 Java SE 21 환경을 기준으로 한다.

JDK와 Eclipse는 대체 관계가 아니라 역할 분담 관계다

JDK(Java Development Kit)는 Java 플랫폼과 컴파일러·디버거·문서 도구 같은 개발 도구의 묶음이다. 반면 Eclipse는 소스 작성, 프로젝트 구성, 실행을 편리하게 만드는 통합 개발 환경이다. Eclipse를 설치했다고 해서 Java 컴파일러의 역할까지 개념적으로 사라지는 것은 아니다.

도구·환경핵심 역할대표 확인 항목
JDK컴파일·실행·디버깅에 필요한 Java 개발 환경 제공javac, java 명령 사용 가능 여부
PATH명령 프롬프트가 실행 파일을 찾을 경로 제공JDK의 bin 폴더 포함 여부
JDK_HOME강의 예시에서 JDK 설치 폴더를 나타냄bin이 아니라 JDK 루트 경로인지
Eclipse프로젝트·패키지·클래스 단위 개발 지원workspace와 프로젝트 위치

강의자료는 JDK 21의 Windows 설치 경로를 예로 들어 PATH에 C:\Program Files\Java\jdk-21\bin, JDK_HOME에 C:\Program Files\Java\jdk-21을 지정한다. 이 경로는 강의 환경의 예시이므로 실제 설치 폴더와 버전에 맞춰 확인해야 한다.

오류 진단 순서: 명령을 찾지 못하면 소스 코드보다 먼저 JDK 설치 여부 → PATH의 bin 경로 → 새 명령 프롬프트 반영 여부를 확인한다.

workspace에서 클래스 실행까지 저장 구조를 따라간다

Eclipse의 workspace는 프로젝트 폴더, 소스 코드와 생성된 클래스 파일 등을 저장하는 작업 공간이다. 개발 흐름은 workspace 선택 → Java 프로젝트 생성 → 패키지 생성 → 클래스 생성 → 소스 작성 → 실행 순서로 정리할 수 있다.

  1. Java 프로젝트를 만든다.
  2. 클래스들을 분류해 저장할 패키지를 만든다.
  3. 패키지 안에 클래스를 만들며, 클래스 이름이 public 클래스의 파일 이름을 결정한다.
  4. 소스를 저장해 컴파일하고, main() 메서드를 가진 클래스를 실행한다.
  5. 필요하면 실행에 필요한 클래스 파일을 묶어 JAR 파일로 배포한다.

배포는 개발한 Java 프로그램을 묶어 외부에서 실행할 수 있게 내보내는 과정이다. Eclipse의 Export 기능에서 JAR 유형과 저장 경로·이름을 지정할 수 있다. JAR은 여러 클래스 파일과 필요한 자원을 하나의 파일로 묶는 단위이지, Java 소스를 컴파일하는 도구는 아니다.

java -jar my_project.jar

실행 가능한 JAR로 올바르게 내보냈다는 전제에서 위 명령으로 배포 결과를 실행할 수 있다. 단순 JAR과 실행 가능한 JAR은 실행 진입점 정보의 포함 여부가 다를 수 있으므로 내보내기 유형을 구분한다.

Java 소스는 주석·클래스·main()의 경계를 지켜 읽는다

다음 코드는 강의 범위에 맞춰 다시 구성한 최소 실행 예제다. Java는 대소문자를 구분하므로 Mainmain, Stringstring은 서로 바꿔 쓸 수 없다.

package com;

/** 프로그램 전체를 설명하는 문서 주석 */
public class Main {
    public static void main(String[] args) {
        // 이 문장은 콘솔에 문자열을 출력한다.
        System.out.println("Hello, Java Application!");
    }
}

package com;은 클래스가 속한 패키지를 나타낸다. public class Main이 public 클래스 선언이므로 파일 이름은 Main.java여야 한다. public static void main(String[] args)는 애플리케이션 실행이 시작되는 진입점이며, System.out.println()은 괄호 안의 문자열을 표준 출력으로 보낸다.

주석 형식범위용도
/* ... */여러 줄 가능실행과 무관한 일반 설명
/** ... */선언 앞의 여러 줄javadoc으로 문서 생성이 가능한 설명
// ...해당 줄의 뒤쪽짧은 한 줄 설명

주석은 실행 결과에 영향을 주지 않지만, 세 형식의 목적은 같지 않다. 특히 /** ... */는 일반 블록 주석처럼 실행에서 제외되는 동시에 문서 생성에 활용할 수 있다.

클래스는 설계이고 객체는 그 설계로 만든 개별 실체다

추상화는 구체적인 모든 사실을 나열하는 대신 현재 문제에 필요한 공통 특징을 추려 표현하는 과정이다. 예를 들어 자동차를 프로그램에서 다룰 때 제조 과정의 모든 나사를 기록하기보다 색상·속도 같은 상태와 가속·정지 같은 행위만 선택할 수 있다.

클래스는 공통 특징을 가진 객체를 만들기 위한 모형 또는 틀이다. 객체의 상태는 필드로, 행위는 메서드로 구현한다. 객체는 특정 클래스로부터 실제로 만들어진 인스턴스다. 따라서 클래스 하나에서 여러 객체가 생길 수 있고, 각 객체는 같은 필드 구조를 가지면서도 서로 다른 값을 저장할 수 있다.

class Grade {
    int english;
    int math;

    void printTotal() {
        System.out.println(english + math);
    }
}

public class Main {
    public static void main(String[] args) {
        Grade first = new Grade();
        Grade second = new Grade();

        first.english = 92;
        first.math = 81;
        second.english = 76;
        second.math = 88;

        first.printTotal();
        second.printTotal();
    }
}

실행 결과는 첫 번째 객체의 173, 두 번째 객체의 164가 차례로 출력된다. 계산 과정은 92 + 81 = 173, 76 + 88 = 164이다. 두 객체는 같은 Grade 클래스로 만들었지만 필드 값은 독립적이다.

C의 성적 배열과 Java의 성적 객체는 무엇을 함께 묶는지가 다르다

강의자료의 C 예에서는 영어 성적 배열과 수학 성적 배열을 별도로 두고, 입력 함수와 출력 함수가 그 배열을 처리한다. Java 예에서는 학생 한 명의 영어·수학 점수와 합계 출력 기능을 Grade 클래스 안에 캡슐화하고, 학생 수만큼 객체를 만든다.

판단축C 성적 처리 예Java 객체지향 예
데이터 묶음과목별 배열 e[], m[]학생별 객체의 english, math
기능 위치배열을 처리하는 별도 함수필드와 관련된 메서드를 클래스에 함께 정의
개별 학생 표현같은 배열 인덱스로 관계를 맞춤Grade 인스턴스로 표현
확장할 때의 질문새 데이터가 어느 배열·함수에 반영되는가?학생 객체의 상태·행위 중 어디에 속하는가?

이 비교의 핵심은 “C에서는 객체지향을 전혀 표현할 수 없다”가 아니다. 강의의 두 예제가 데이터를 조직하는 기본 단위를 어떻게 잡았는지 비교하는 것이다. Java 예제는 한 학생에 속한 데이터와 기능을 클래스에 모아 객체 단위로 다룬다.

객체지향 판정 질문: 프로그램에서 함께 변하고 함께 사용되는 상태와 행위를 어떤 클래스에 묶을지 먼저 찾고, 그 클래스로 필요한 개수의 객체를 만든다.

컴파일 오류와 실행 오류를 단계부터 구분한다

오류를 고칠 때는 메시지만 읽기 전에 어느 단계에서 멈췄는지 확인한다. Main.java 안의 public 클래스 이름이 Start라면 파일 이름 규칙 때문에 컴파일 단계에서 문제가 난다. 반대로 컴파일은 되었지만 실행할 클래스 이름을 잘못 입력했다면 실행 단계에서 Java VM이 대상을 찾지 못한다.

증상먼저 볼 단계우선 확인할 것
javac 명령을 찾지 못함개발 환경JDK 설치와 PATH
public 클래스와 파일 이름 불일치컴파일A.javapublic class A의 일치
실행 진입점을 찾지 못함실행main() 형식과 실행 클래스
예상과 다른 객체 값 출력프로그램 논리어느 인스턴스의 필드를 대입·호출했는지

이 진단 순서는 다음 차시의 기본 문법을 배울 때도 그대로 쓸 수 있다. 먼저 환경, 다음으로 컴파일, 그다음 실행 진입점, 마지막으로 프로그램 논리를 살피면 원인이 섞이지 않는다.

핵심 개념 정리

  • .java는 소스이고 .class는 컴파일된 바이트코드다.
  • 플랫폼 독립성은 공통 바이트코드와 운영체제별 Java VM의 역할 분담으로 이해한다.
  • JDK는 개발 도구와 플랫폼의 묶음이고, Eclipse는 프로젝트 개발을 돕는 IDE다.
  • public 클래스 이름은 파일 이름과 일치해야 하며 main()이 애플리케이션의 실행 진입점이다.
  • 클래스는 필드와 메서드를 정의하는 틀이고, 객체는 그 클래스로 생성된 인스턴스다.
  • 객체지향 구조는 관련 상태와 행위를 클래스에 묶고 객체 간 상호작용으로 프로그램을 구성한다.

새 Java 프로그램을 만나면 소스 위치 → 컴파일 결과 → 실행 주체 → 진입점 → 클래스 안의 필드·메서드 → 생성된 객체별 상태 순서로 설명해 보자. 이 여섯 질문에 답할 수 있으면 설치 문제, 실행 문제, 객체지향 구조를 서로 다른 층위에서 진단할 수 있다.

예상문제 10선

1. 명령 프롬프트에서 Hello.java를 강의의 방식으로 컴파일하고 실행하는 흐름으로 옳은 것은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ③

  • ① 오답: 실행을 컴파일보다 먼저 두었고, 컴파일러가 소스를 생성한다고 잘못 연결했다.
  • ② 오답: javac에는 소스 파일명을 주며, java 실행 시에는 .class를 붙이지 않는다.
  • ③ 정답: 소스를 컴파일해 바이트코드를 만든 뒤 클래스 이름으로 실행하는 올바른 흐름이다.
  • ④ 오답: 강의의 명령 흐름과 순서가 다르고, 생성된 클래스 파일을 삭제할 이유도 없다.

2. Java VM에 관한 설명으로 가장 적절한 것은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ①

  • ① 정답: Java VM은 컴파일된 바이트코드를 읽어 현재 환경에서 프로그램을 구동한다.
  • ② 오답: 클래스의 계층적 분류 단위는 패키지이며 Java VM의 정의가 아니다.
  • ③ 오답: 문서 생성에 활용되는 것은 javadoc 문서 주석이다.
  • ④ 오답: 여러 파일을 묶는 배포 단위는 JAR이며 실행 엔진과 구분된다.

3. JDK와 Eclipse의 관계를 바르게 설명한 것은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ④

  • ① 오답: JDK에는 컴파일러 등 개발 도구가 포함되고, Eclipse가 바이트코드 규격을 정의하는 것은 아니다.
  • ② 오답: Eclipse는 IDE이고 workspace는 작업 파일을 저장하는 공간이다.
  • ③ 오답: 두 도구는 함께 사용할 수 있지만 목적과 구성은 서로 다르다.
  • ④ 정답: JDK의 기반 개발 기능과 Eclipse의 통합 작업 환경을 정확히 구분했다.

4. 명령 프롬프트에서 javac 명령을 찾을 수 없다는 메시지가 나왔다. 가장 먼저 확인할 사항은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ②

  • ① 오답: 객체 상태는 프로그램 논리 단계의 문제로, 명령 자체를 찾지 못하는 환경 문제와 다르다.
  • ② 정답: javac 실행 파일은 JDK의 bin에 있으므로 설치와 검색 경로부터 확인해야 한다.
  • ③ 오답: 출력 문자열은 컴파일러 명령의 탐색 여부에 영향을 주지 않는다.
  • ④ 오답: 컴파일 환경이 준비되지 않은 상태에서는 배포가 선행 해결책이 될 수 없다.

5. “Java는 플랫폼 독립적이므로 대상 컴퓨터에 Java 실행 환경이 없어도 실행된다”라는 설명을 바로잡은 것은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ③

  • ① 오답: Java 소스는 운영체제별 기계어가 아니라 컴파일 전의 원본 코드다.
  • ② 오답: JAR은 프로그램 자원을 묶는 파일이며 운영체제를 포함하지 않는다.
  • ③ 정답: 이식 가능한 중간 코드와 환경별 실행기가 역할을 나누는 것이 핵심이다.
  • ④ 오답: 강의의 실행 구조에서는 소스를 바이트코드로 바꾸는 컴파일 단계가 존재한다.

6. 본문의 Grade 예에서 첫째 객체의 점수가 영어 92점, 수학 81점일 때 printTotal()의 출력은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ②

  • ① 오답: 164는 둘째 객체의 76 + 88 결과를 첫째 객체와 혼동한 값이다.
  • ② 정답: 첫째 객체의 두 필드를 더하면 92 + 81 = 173이다.
  • ③ 오답: 수학 점수를 89로 잘못 읽어 더한 결과에 해당한다.
  • ④ 오답: 두 값을 숫자 덧셈이 아니라 문자열처럼 이어 붙인 오류다.

7. 클래스와 객체를 구분한 설명으로 옳은 것은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ④

  • ① 오답: 객체의 특정 값은 필드 상태이며 주석은 클래스·객체 관계와 무관하다.
  • ② 오답: 두 용어는 파일 확장자가 아니라 설계와 실체의 관계를 나타낸다.
  • ③ 오답: 모형과 인스턴스의 방향을 서로 뒤바꿨다.
  • ④ 정답: 하나의 클래스에서 여러 독립적인 객체가 생성될 수 있다는 관계를 정확히 표현했다.

8. Eclipse에서 처음 Java 애플리케이션을 구성하는 순서로 가장 자연스러운 것은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ①

  • ① 정답: 저장 공간과 상위 구조를 먼저 준비한 뒤 소스 단위인 클래스를 만들어 실행한다.
  • ② 오답: 실행·배포를 프로젝트와 클래스 생성보다 앞에 둘 수 없다.
  • ③ 오답: 패키지는 분류 단위이며 Java VM을 프로젝트 안에서 직접 작성하는 과정이 아니다.
  • ④ 오답: JAR 배포는 개발 이후 단계이고 JDK 삭제는 개발 절차가 아니다.

9. /** ... */ 형식의 주석에 대한 설명으로 옳은 것은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ③

  • ① 오답: //는 줄 끝까지 적용되는 한 줄 주석이고 문서 주석과 형식·용도가 다르다.
  • ② 오답: 바이트코드는 컴파일러가 생성하며 주석에 직접 작성하지 않는다.
  • ③ 정답: 선언의 설명을 기록하고 문서 도구에서 활용할 수 있다는 두 성격을 모두 갖는다.
  • ④ 오답: 패키지 선언은 package 문장으로 작성하며 주석이 아니다.

10. Main.java의 public 클래스 이름이 Start이고, 아직 .class 파일이 생성되지 않았다. 가장 적절한 조치는?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ②

  • ① 오답: 컴파일 결과가 없고 실행 명령의 클래스 표기도 잘못되었으므로 먼저 소스 규칙을 고쳐야 한다.
  • ② 정답: public 클래스 이름과 파일 이름을 일치시키는 컴파일 조건을 먼저 해결한 판단이다.
  • ③ 오답: Java는 대소문자를 구분하며 컴파일되지 않은 소스를 곧바로 배포할 수 없다.
  • ④ 오답: PATH는 실행 파일 탐색 문제를 다루며 소스 파일명 규칙을 고치지 않는다.

참고 자료와 작성 기준

이 글은 해당 차시 강의자료를 바탕으로 학습 목적에 맞게 재구성한 비공식 학습자료입니다. 실행 흐름, 오류 진단, 성적 객체 예제와 문제 해설은 학습자의 이해를 돕도록 새로 구성하고 검토했습니다.

  • 작성·편집: 올에이클래스 학습연구팀
  • 주요 근거: 한국방송통신대학교 Java프로그래밍 1강 「Java와 객체지향 프로그래밍」 강의자료(교재 1장, 강의자료의 JDK 21 환경 예시 포함)
  • 보충 자료: 별도의 외부 자료를 본문 근거로 사용하지 않음
  • 편집 원칙: 올에이클래스 편집 정책
  • 최종 내용 검토: 2026-09-01

댓글