Dev/Java

[Java] Java 개념

syuare 2025. 4. 14. 16:23

 

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()과 같은 메서드를 호출하면 "시동 켜기" 동작을 수행할 수 있음