Java 개요
본 내용은 책 "자바의 신" (로드북) 을 보고 공부한 내용 중 개인적으로 도움될 부분들을 적은 것입니다. 잘못된 점이 있다면 언제든지 지적해 주세요 !
자바 프로그램의 실행 원리
일반 다른 프로그램들은 기본 적으로 운영체제 위에서 작동하므로 운영체제의 영향을 받을 수 밖에 없다. sound나 graphic적인 부분 등 여러 부분을 운영체제에서 빌려오기 때문이다. 따라서 만약 자바가 아닌 다른 프로그래밍 언어로 윈도우 위에서 소스코드를 작성했다면, 그 프로그램을 리눅스나 맥에서 실행시키고 싶으면 소스코드를 그에 맞게 수정해야 하는 일이 발생한다. 즉 우리가 만든 프로그램이 운영체제에 의존적이게 된다.
하지만 자바는 다르다.
자바 프로그램은 JAVA Virtual Machine 위에서 동작한다. 이 자바 가상 머신은 운영체제 위에서 동작하며 자바 프로그램과 운영체제 사이의 중간자 역할을 하게 된다. 따라서 이 자바 가상 머신을 운영체제에 맞게 윈도우용, 리눅스용 등으로 갖추면 소스코드를 수정하지 않고도 프로그램을 실행시킬 수가 있다.
즉 운영체제에 의존적이지 않고 독립적인 프로그램을 만들 수가 있다는 매력적인 장점을 가지고 있다.
이를 소위 write once, run anywhere ! 이라고 한다.
정리하자면 우리가 작성한 소스코드는 확장자가 .java가 된다. 이 파일은 high-level language이므로 기계어로 바꿔주는 컴파일 작업이 필요하다. 이를 해주는 컴파일러가 javac다. 이 컴파일 과정을 거치면 .class라는 파일이 생긴다. 이를 JVM(자바 가상 머신)이 받아 실행시켜 주는 일련의 과정을 행하는 프로그램이 java.exe인 런처다.
그런데 몇몇 사람들은 이러한 자바 가상 머신 때문에 속도가 저하된다는 문제를 삼는다. 이는 사실이다.
실제로 운영체제와 바로 연결되어 실행되는 다른 프로그램 보다는 한 단계 더 거치는 자바 프로그램이 실행되는 속도가 조금 더 느릴 수 있다.
하지만 이를 문제 삼기에는 자바라는 언어가 가지는 다른 이점들이 비교도 안되게 크기 때문에 많은 사람들이 자바를 애용하고 빠르게 발전할 수 있었던 것이다. 그리고 사실 요즘은 실행속도를 따지기 보다는 소프트웨어의 개발 속도를 더 따지는 편이고, 인터넷이나 네트워크 기반의 소프트웨어들이 많기 때문에 소스코드의 실행속도보다 데이터의 전송속도가 더 중요시 된다.
참고로 보통 cmd 창에서 자바 프로그램을 실행하기 위해 JDK의 bin 디렉토리를 환경변수 PATH로 설정한다.
cmd 창에서 어떤 프로그램이 실행되려면 그 프로그램의 확장자는 exe, com, bat 중 하나로 끝나아만 한다. 하지만 PATH에 실행하고자 하는 경로를 지정하면 해당 확장자가 있는 파일을 PATH에서 찾아 실행한다.
즉, 자바 컴파일 파일을 cmd 창의 어떤 위치에서라도 실행할 수 있게 된다.
Class, Method, 객체에 대해
자바 프로그램은 여러 개의 클래스 파일들이 이루고 있다. 이런 의미에서 클래스는 자바의 가장 작은 단위라고 할 수 있다.
이 클래스라는 개념은 객체지향 언어인 자바에서 매우 중요하다. 보통 현실의 객체(추상적인 것도 포함해서)혹은 인스턴스를 클래스로 표현하게 되는데, 이때 클래스는 상태와 행동이 있어야 한다. (필수는 아니다)
상태는 클래스의 특성을 결정짓는 변수(정확히는 인스턴스 변수)고, 행동은 메소드다.
메소드는 다른 언어에서 함수라 표현한다. 메소드는 다음 6가지로 나눌 수 있다.
1 2 3 4 5 6 | public class Calculator{ public static void main(String[] args){ System.out.print("Calculator class started"); } } | cs |
1. 제어자(modifier) - 메소드의 특성을 정하는 부분 (public static)
2. 리턴 타입 - 메소드가 끝났을 때 반환하는 타입 (void)
3. 메소드 이름 - 보통 소문자로 시작해서 중간에 대문자를 섞는 방식으로 짓는다
4. 매개 변수 목록(parameter list) - 메소드에 전달할 인자 값 (String[] args)
5. 예외 목록(exception list)
6. 메소드 내용 - { ... }
여기서 컴파일이 정상적으로 수행되기 위해 필수로 작성해 줘야 하는 것은 2. 리턴 타입, 3. 메소드 이름, 6. 메소드 내용 이다.
주의해야 할 점은 클래스가 곧 객체는 아니라는 점이다. 클래스는 우리가 추상적으로 모양을 잡아 놓은 껍데기일 뿐이고, 이 클래스의 생성자를 호출해 변수에 담으면 그 변수가 바로 객체가 된다.
이 객체가 생성돼야지만 우리가 객체의 상태를 정하고, 행동을 시킬 수 있다. (static은 예외로 두고)
4가지 변수, 2가지 자료형
변수를 굳이 4가지로 나눈 이유는 각 변수마다 생명주기가 다르고 이 때문에 사용되는 용도가 다르기 때문이다.
지역 변수 (local variables) - 중괄호 내에서 선언된 변수로 중괄호 내에서만 유효하다.
매개 변수 (parameters) - 메소드에 넘겨주는 변수로 메소드가 호출될 때 생명이 시작되고, 메소드가 끝나면 소멸된다.
인스턴스 변수 (instance variables) - 메소드 밖에, 클래스 안에 선언된 변수. 앞에는 static이라는 예약어가 없어야 한다. 객체가 생성될 때 생명이 시작되고, 그 객체를 참조하고 있는 다른 객체가 없으면 소멸된다.
클래스 변수 (class variables) - 인스턴스 변수에서 타입 선언 앞에 static이라는 예약어가 붙어 있다. 클래스가 처음 호출될 때 생명이 시작되서 프로그램이 끝날 때 소멸된다.
자바의 타입에는 크게 2 가지가 있다. 하나는 참조 자료형, 다른 하나는 기본 자료형이다.
참조 자료형은 프로그래머가 마음대로 만들 수 있는 자료형으로 일반적인 class가 된다. 기본 자료형은 Java 프로그램 내에서 이미 만들어져 있는 자료형으로 다른 언어에도 거의 비슷하게 존재한다.
둘의 가장 큰 차이점은 초기화하는 방법에 있다.
참조 자료형은 new라는 예약어와 함께 생성자로 초기화를 하고, 기본 자료형은 생성자가 필요 없고 실제 값이나 변수로 초기화를 한다.
기본 자료형 8가지
main() 메소드
C나 C++에서 실제로 실행되는, 꼭 하나가 존재해야 하는 함수가 main() 함수다. Java에서도 비슷한 느낌이다.
Java 명령으로 실행하는 자바 프로그램의 시작점은 main() 메소드다. 때문에 반드시 있어야 한다. 자바 기반으로 실행되는 모든 프로그램에 있는 수 많은 클래스 중에 적어도 하나의 main() 메소드가 있는 클래스가 있고, 그 메소드가 수행된다.
그리고 main() 메소드는 반드시 다음과 같이 선언되야 한다.
1 2 | public static void main(String[] args){ } | cs |
자세히는 아니지만 아까 전에 클래스가 객체로 만들어 져야지만 메소드를 호출(행동을)할 수 있다고 했다. 하지만 main이라는 메소드는 static 선언이 되어 있기 때문에 객체 생성 없이 호출할 수 있다. 이 부분은 다음에 다시