[Java] Java 개념
Java
Java는
어떤 환경(Windows, Mac, Linux, etc)에서든 실행될 수 있도록,
Write Once, Run Anywhere! 슬로건으로 만든 언어!
- C, C++ 등의 언어는 운영체제마다 코드가 다르게 동작하는 문제가 있었음
public class Main {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}
Java의 모든 코드는 클래스(class) 안에 존재
class 클래스이름 {
//*↓Java 코드 파일을 실행할때 제일 먼저 실행되어야 하는 부분을 표시하는 약속된 규칙
public static void main(String[] args) { // 프로그램의 시작점
// 실행될 명령어들을 작성하는 공간입니다.
}
}
Java 특징
플랫폼의 독립성:
- 어떤 환경에서든 실행될 수 있다.
- Javac와 JVM을 통해서 플랫폼의 독립성을 보장받을 수 있다.
JDK(Java Development Kit): Java 프로그램 개발 시 필요한 개발 도구 모음
Javac(Java Compiler): 자바 컴파일러
JVM(Java Virtual Machine): 자바 가상 머신
Javac - 자바 컴파일러
- .java 파일을 바이트코드(.class)로 변환
- 바이트코드(bytecode): JVM이 해석할 수 있는 코드
- Java 프로그램이 실행되기 위해 변환되는 중간 단계 코드
- JVM만 있으면 어떤 실행환경이든 실행 가능
JVM - 자바 가상 머신
- 바이트코드를 해석하고 자바 프로그램 실행시키는 역할
- JVM 덕분에 실행 환경에 관계없이 Java 프로그램 동작시킬 수 있다.
// Main.java에 작성된 코드
public class Main {
public static void main(String[] args) {
System.out.println("Hello, Java!");
}
}
// Javac/자바 컴파일러가 작성된 java 코드를 읽고 JVM에 명령하기 위해 생성한 Main 바이트코드
// class version 52.0 (52)
// access flags 0x21
public class Main {
// compiled from: Main.java
// access flags 0x1
public <init>()V
L0
LINENUMBER 1 L0
ALOAD 0
INVOKESPECIAL java/lang/Object.<init> ()V
RETURN
L1
LOCALVARIABLE this LMain; L0 L1 0
MAXSTACK = 1
MAXLOCALS = 1
// access flags 0x9
public static main([Ljava/lang/String;)V
L0
LINENUMBER 4 L0
GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
LDC "Hello, Java!"
INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/String;)V
L1
LINENUMBER 5 L1
RETURN
L2
LOCALVARIABLE args [Ljava/lang/String; L0 L2 0
MAXSTACK = 2
MAXLOCALS = 1
}
객체지향
Java의 모든 것이 객체(class)로 이루어져 있다.
- 객체(object)와 클래스(class)는 개념적으로는 다르지만, 실무에서는 혼용해서 많이 사용한다.
// Main.java 안에 Main이라는 class, 객체가 있다.
// Java의 모든 코드들은 이 class 안에 위치하게 된다.
public class Main {
public static void main(String[] args) {
System.out.println("Hello, Java!");
}
}
// 이 코드에서 class는 Main 이고,
// Main class는 프로그램을 시작하는 main 메서드를 포함하고 있다.
// 객체는 class로부터 생성된 실제 인스턴스
// JVM이 프로그램 실행 시 main 메서드를 호출 > class 내용 이해
// -> Main 클래스의 객체를 직접 생성하지는 않음
// System.out > Java 표준 라이브러리에 정의된 객체
// System: class
// out: 미리 생성된 PrintStream 객체
// System.out.println("Hello, Java!");를 호출
// -> 이미 생성된 객체의 메서드를 이용해서 콘솔에 출력한다.
클래스(class)와 객체(object)
항목 | 클래스 | 객체 |
---|---|---|
정의 | 객체를 생성하기 위한 설계도(템플릿) | 클래스로부터 생성된 구체적인 인스턴스(실체) |
역할 | 어떤 속성과 메서드를 가져야 하는지 정의 | 정의된 구조와 기능을 실제로 구현하며 고유의 상태를 유지 |
특징 | 추상적인 개념이며 단독으로 실행되지 않음 | 메모리 상에 존재하며 실행 중인 실체로 동작함 |
비유 | 건축 도면 또는 설계도 | 도면을 바탕으로 지은 실제 건물 |
클래스: 건축 설계도
- 어떤 속성(데이터)과 동작(메서드)를 가져야 하는지 정의함
- 건축 설계도를 기반으로 여러 건물을 건축할 수 있음 > 클래스로 부터 여러 객체(인스턴스)를 생성할 수 있음
- 추상적인 개념, 단독으로는 실제 동작하는 실체가 아님
객체: 건축 설계도를 바탕으로 만든 실제 건축(실체)
- 클래스로부터 생성된 구체적인 인스턴스
- 클래스가 정의한 구조와 기능을 실제로 가지고 있음, 메모리 상에 존재하는 실체
- 건축 설계도를 바탕으로 지은 실제 건축
- 동일한 설계도를 가지고 여러 건물을 건축할 수 있지만, 각 건물들별로 개별적인 특성과 상태(색상, 크기, 위치 등)을 가질 수 있음
- 실제 데이터를 포함하고 있음, 프로그램 실행 중에 동작하는 주체
- 각 객체는 고유의 상태(예: 속성 값)를 가지며, 이 상태는 런타임 중에 변경될 수 있음
거대한 생태계
Java는 오랜 시간동안 선호되어 온 프로그래밍 언어.
오랜 시간 선호된만큼 방대한 자료 형식으로 갖춰져 있음. (공식문서, 기술 블로그, 참고 서적 등)
JAVA 이름 규칙
코드를 작성하다보면 각 언어별로 이름 규칙이 있다.
변수/함수 이름 규칙
JAVA에서는 Camel case(카멜케이스)를 사용한다.
- 첫글자는 소문자로 시작 > 단어 중간에 새로운 단어가 시작되면 대문자를 사용한다
- 카멜케이스 규칙을 사용하는 언어는 대표적으로 Java, JS, C# 등이 있다.
// 예시
firstName
lastName
isMale
패키지 이름 규칙
- 패키지: 파일들의 묶음 (src 폴더 내 생성된 폴더 개념)
- Java에서 패키지명은 소문자만으로 작성하는 것을 권장한다.
- 특수문자 X, 숫자 시작 X, 예약어 사용 X
// 예시
chapter1
// 패키지 내 클래스 표현
chapter1.MyNewClass
클래스(class) 이름 규칙
- 클래스 이름은 첫글자 대문자 + 카멜케이스 조합으로 작성 > Pascal case(UpperCamelCase)
- 언더바 X, 숫자 시작 X , 특수 문자 X, 예약어 사용 X
// 예시
MyNewClass
스네이크케이스 (Snake case)
- 단어 사이에 언더스코어(_)로 구분한다.
- 스네이크케이스를 사용하는 언어는 파이썬, 루비 등이 있다.
first_name
last_name
full_name
*해당 이름 규칙을 사용하지 않을 경우 오류가 발생하는가?
그렇지는 않다. 이름 규칙을 꼭 지키지 않더라도 문법적인 오류는 발생하지 않는다.
다만, 이러한 이름 규칙은 이미 여러 개발자들 사이에서의 약속으로 되어 있고,
인터넷상에 퍼진 많은 코드들이 해당 규칙을 지킨 코드들이다.
*결론: 앞으로 코드를 작업할 때 해당 이름 규칙을 지켜보도록 하자!
Appendix. 객체(Object)란?
데이터와 데이터를 다루는 방법(함수, 메서드 등)을 하나로 묶은 독립적인 단위
- 인스턴스(instance): 객체는 클래스라는 틀에서 생성된 인스턴스
- 상태(state): 객체가 가지고 있는 데이터나 속성
- 행동(behavior): 객체가 수행할 수 있는 작업이나 기능
- 캡슐화(Encapsulation): 관련된 데이터와 기능을 하나로 묶어서 외부에서 직접 접근하지 못하도록 보호하는 것
- 데이터의 무결성이 유지됨
- 내부 구현이 변경되어도 외부에는 인터페이스만 노출됨에 따라 프로그램 유지보수 용이해짐
- 접근제어자로 구현
- private: 선언된 객체 내부(동일한 클래스)에서만 접근 가능
- public: 다른 객체에서 해당 객체의 인스턴스를 생성, 접근 가능
// 예시
Car 라는 클래스가 존재할때,
- 인스턴스: 특정 자동차(예- 내 차, my Car)는 Car 클래스의 객체가 된다.
- 상태: 자동자라는 객체는 색상이나 모델, 속도 등의 속성(필드)를 가질 수 있다.
- 행동: 자동차라는 객체는 주행, 정지, 가송 등의 동작(메서드)들을 포함할 수 있다.
객체의 특징
독립성과 자율성
- 각 객체는 자체적인 데이터를 보유하고 있고, 스스로 동작을 수행한다.
- 서로 다른 객체들은 메시지를 주고 받으면서 협력을 할 수 있지만 내부의 세부 구현은 독립적이다.
상태 유지
- 객체는 자신의 속성(데이터)을 보존함 > 그 상태에 따라 서로 다른 동작을 수행할 수 있다.
- 예) 자동차 객체가 "시동이 걸린" 상태라면 "주행" 동작이 가능하다. (반대로 "시동이 꺼졌다면" 주행이 불가능하다)
클래스와의 관계
- 객체는 클래스로부터 생성됨 > 클래스는 객체의 설계도 역할
- 클래스는 객체가 어떤 속성, 메서드를 가져야 하는지 정의함 > 이를 토대로 여러 객체가 만들어짐
재사용성과 확장성
- 한 번 정의된 클래스를 통해 여러 객체를 생성할 수 있음
- 코드 재사용성이 높아짐
- 객체 간의 상속, 다형성 등 개념을 통해 시스템 전체의 확장성과 유연성 확보 가능
// 전체적인 예시 - 자동차
1.클래스 정의:
- Car라는 클래스를 만들고,
- 이 클래스에 자동차의 속성(예: 색상, 모델, 속도)과 행동(예: 시동 켜기, 가속, 정지)을 정의함
2.객체 생성:
- Car 클래스를 이용해 여러 대의 자동차 객체를 생성 가능
- 예를 들어, myCar, yourCar 등이 각각 독립적인 자동차 객체로 볼 수 있음
3.상태와 행동:
- myCar 객체의 속성은 "빨강", "스포츠카", 0km/h 등
- yourCar 객체는 "파랑", "세단", 50km/h로 설정
- 이처럼 각 객체는 고유의 상태를 가지며
- myCar.startEngine()과 같은 메서드를 호출하면 "시동 켜기" 동작을 수행할 수 있음