Java

JDK (Java Development Kit) + IntelliJ / Java 메인 클래스 / src 파일과 out 파일 /

wy-family 2024. 11. 19. 00:34

자바 언어로 데스크톱 응용소프트웨어를 개발해보려면

-> JavaSE 개발환경 구축해야 함 (Java Platform, Standard Edition)

--> JDK 소프트웨어를 설치해야 함. (Java 언어는 무료지만, OracleJDK 유료, OpenJDK 무료, 그래서 OpenJDK 설치 - JDK SE 11) 

---> 코딩을 위한 도구는 IntelliJ 를 쓸 예정 (나는 대학때 Eclipse 를 썼던 걸 기억한다. IntelliJ가 현업에서 많이 쓰인다고 함)

 

JDK SE 11 설치 후 환경 설정 완료!

 

IntelliJ 도 설치!

강의에서는 Community (무료 버전)으로 한다고 했지만, fastcampus에서 ultimate (유료 버전)을 몇개월간 사용가능한 쿠폰을 제공해줘서 나는 쿠폰을 사용할 겸 ultimate 로!

 

 

전통의 hello world~ 프로그래밍 언어 공부의 시작을 알리는 문장, hello world~


공부를 시작해보자!

 

'Java가 객체지향이다'라는 말은 예전부터 많이 들어봤다.

근데 그게 이해하기 쉽게 말하면 뭘 의미하는걸까?

 

Java가 객체지향 언어라는 말은 프로그램을 구성할 때 **"객체"**라는 개념을 중심으로 코드를 작성하는 방식을 의미해요. 객체지향은 현실 세계의 사물을 코드로 표현하는 방식에서 시작되었고, Java에서는 이를 잘 반영할 수 있는 기능을 제공합니다.

쉽게 설명하자면:

  1. **객체(Object)**란 우리가 코드로 표현하고 싶은 대상이나 개념이에요. 예를 들어, 자동차, 사람, 책 등이 객체가 될 수 있어요. Java에서는 이런 객체들을 클래스로 정의하고, 그 객체들이 가지고 있는 특성(속성)과 행동(기능)을 코드로 구현해요.
  2. **클래스(Class)**는 객체를 만들기 위한 청사진이라고 생각할 수 있어요. 예를 들어, Car라는 클래스를 만들면, 그 클래스는 자동차가 가져야 할 속성(예: 색상, 모델, 속도)과 기능(예: 주행, 정지)을 정의할 수 있어요.
  3. 객체를 만들고 조작하는 방식으로 프로그래밍을 하면, 코드가 훨씬 더 직관적이고 재사용성이 높아져요. Java에서는 하나의 클래스를 만들어 여러 객체를 생성할 수 있고, 객체 간 상호작용을 통해 프로그램을 구성할 수 있어요.

객체지향의 주요 개념

  • 캡슐화 (Encapsulation): 객체는 자신의 속성과 기능을 보호하고, 외부에서는 필요한 부분만 접근할 수 있게 해요.
  • 상속 (Inheritance): 이미 만든 클래스를 기반으로 새로운 클래스를 만들 수 있어요. 예를 들어, Vehicle이라는 클래스에서 Car, Bike 같은 서브클래스를 만들 수 있죠.
  • 다형성 (Polymorphism): 같은 메서드를 여러 객체가 다르게 구현할 수 있어요.
  • 추상화 (Abstraction): 복잡한 구현을 숨기고 필요한 부분만을 노출해요.

예를 들어

Car라는 클래스를 만들어서 HyundaiCar, BMWCar 같은 다양한 객체를 만들고, 각 객체가 다른 기능을 가질 수 있어요. 이처럼 Java의 객체지향은 현실의 사물과 개념을 코드로 표현하고, 유지보수와 확장을 쉽게 하려는 방식이라고 볼 수 있어요.


객체지향이라는 것이, object 중심이라고 하면 인간 중심적인 표현이라고 하고, class 중심이라고 해야 프로그래밍 언어의 관점에서 표현한거라고 하는데 맞는말이야? 맞다면, 무슨 뜻이야?

 

네, 맞는 말이에요. 객체지향을 'object 중심'으로 표현하면 인간이 이해하기 쉬운 현실 세계의 사물에 중점을 둔 관점이고, 'class 중심'으로 표현하면 프로그래밍 언어 관점에서 구현의 구조에 중점을 둔 관점이에요.

이 두 표현의 차이는 다음과 같은 의미를 가지고 있어요:

1. Object 중심 (현실 세계의 관점):

  • Object 중심이라는 표현은 객체지향 프로그래밍의 개념을 인간이 이해하기 쉬운 방식으로 설명할 때 사용됩니다. 객체지향 프로그래밍의 기본 아이디어는 현실 세계의 개념을 코드로 옮기는 데 있는데, 현실 세계의 자동차, 사람, 책 같은 '사물'들을 객체로 보고 이를 중심으로 설명하는 방식이죠.
  • 이때 **object는 실제 세계의 사물이나 개념을 반영한 구체적인 '존재'**로서 프로그램에서 데이터를 보관하고 행동을 수행합니다. 예를 들어, Car 객체는 '주행', '정지' 같은 행동을 수행할 수 있는 구체적인 자동차를 의미하죠.
  • Object 중심으로 설명하면, 객체지향의 목표는 프로그래머가 현실 세계를 코드로 모델링하기 쉽게 하려는 것에 있다고 이해할 수 있어요. 이 방식은 특히 객체지향의 직관적 이해에 도움을 줍니다.

2. Class 중심 (프로그래밍 언어의 관점):

  • 반면, Class 중심프로그래밍 언어가 객체지향을 실제로 구현하는 방식에 초점을 둔 표현이에요. 프로그래밍 언어에서 객체지향을 구현하려면 먼저 클래스를 정의해야 하고, 객체는 이 클래스로부터 생성됩니다.
  • 클래스는 객체를 만들기 위한 청사진으로, 클래스 중심에서 보면 객체는 클래스에서 파생된 인스턴스일 뿐이죠. 따라서 클래스 중심 관점에서 객체지향을 설명하면 구조와 설계에 중점을 두게 됩니다.
  • 클래스 중심은 코드 작성 시 객체의 역할과 관계를 체계적으로 설계하게 하는 데 중점을 두며, 재사용성과 확장성을 강화합니다. 이 방식은 객체지향을 더 체계적이고 정밀하게 구현하기 위한 접근 방법이라고 할 수 있어요.

결론적으로

객체지향을 이해할 때 Object 중심 관점은 객체지향의 인간 친화적인 면을 설명하는 데 도움을 주고, Class 중심 관점은 프로그래밍 언어의 구조와 설계 측면에서 더 깊은 이해를 제공해요. 둘 다 객체지향을 이해하는 데 중요한 역할을 하며, 객체지향의 철학과 실제 구현을 종합적으로 이해할 수 있도록 해줍니다.

여기서 중요하다고 생각되는 표현이, <클래스는 객체를 만들기 위한 청사진으로, 클래스 중심에서 보면 객체는 클래스에서 파생된 인스턴스일 뿐. 클래스 중심 관점에서 객체지향을 설명하면 구조와 설계에 중점을 두게 된다>

Java 메인 클래스 (시작 클래스) 만들기

- main 메서드를 가지고 있는 클래스

- 많은 클래스 중에서 메인 클래스는 딱 1개가 존재한다.

- 메인 클래스부터 프로그램이 시작된다.

public class Calculator{
 public static void main(String[] args){
  # 동작을 구현해주는 것
 }
}

저렇게 main 메서드가 있는 클래스가 메인 클래스 (시작 클래스)

이렇게, main 메서드가 프로그램의 시작점이 되는 기본 골격을 가지는 걸 JavaSE 프로그램이라고 한다.

JavaEE 는 예를 들어서, main이 시작점이 아니라 service 라고 한다.

 

메인 클래스란?

  • 메인 클래스는 main 메서드를 포함하는 클래스입니다. 이 클래스가 프로그램의 진입점이 되며, Java 가상 머신(JVM)은 프로그램을 실행할 때 메인 클래스를 찾고 main 메서드를 호출하여 프로그램을 시작합니다.
  • 메인 클래스는 딱 하나만 존재하며, main 메서드를 통해 Java 애플리케이션의 흐름을 시작하는 역할을 합니다.

main 메서드의 역할

  • public static void main(String[] args)는 Java 프로그램의 시작 지점이 되는 특별한 메서드입니다.
    • public: 어디서나 접근할 수 있어야 하기 때문에 public으로 선언됩니다.
    • static: 프로그램이 시작될 때 객체를 생성하지 않고도 바로 실행될 수 있도록 static으로 선언됩니다.
    • void: 반환할 값이 없다는 의미입니다. main 메서드는 프로그램의 시작 지점일 뿐 반환값이 필요하지 않죠.
    • String[] args: 프로그램 시작 시 외부에서 전달받는 인수를 받아들이는 배열로, 명령줄에서 전달된 값을 받는 역할을 합니다.

여기서 재밌는 건,

sout --> System.out.println(); 이 된다는 것! 신기하네

 

System.out.println(a);는 Java에서 콘솔에 a의 값을 출력하는 명령입니다. 여기서 각 부분이 어떤 역할을 하는지와, 간단히 줄여서 사용할 수 있는 방법을 설명드릴게요.

System.out.println(a);의 구성

  1. System: System은 Java의 표준 라이브러리에 포함된 클래스입니다. 시스템 관련 기능을 제공하며, 표준 입출력(input/output), 오류 처리 등을 지원합니다.
  2. out: System 클래스의 정적(static) 필드인 out은 표준 출력 스트림을 나타냅니다. System.out은 콘솔로 데이터를 출력하는 역할을 하며, 이 객체는 PrintStream 클래스의 인스턴스입니다.
  3. println(a): println은 PrintStream 클래스에 정의된 메서드로, 출력한 후 줄을 바꾸는 기능을 합니다. a의 값을 출력하고, 줄 바꿈이 포함됩니다.

즉, System.out.println(a);은 a의 값을 표준 출력(보통 콘솔)에 표시하고 한 줄을 내려줍니다.


자바 프로젝트를 하나 만들면, src 폴더가 생성된다. 거기에서 새로운 소스코드를 만들어서 코드를 작성한다.

그런데, 거기에 쓰인 코드는 인간인 내가 알아보기 좋은 언어로 작성되는 것이다. 그런데, 그 코드를 작동시키는 건 컴퓨터다. 그 코드를 실행하는 건 컴퓨터라서 컴퓨터가 이해할 수 있는 언어로 변환을 해줘야 한다. 그게 compiler, 컴파일러가 하는 일이다.

보통 run 버튼을 누르기 전에는 컴파일이 안 되는데, run 버튼을 누르면 컴파일도 하고 실행도 하는 것.

그러니까 run 버튼을 눌러야 컴파일이 진행되어서 언어 변환도 이루어지는 것.

 

소스파일은 .java 로 src 폴더에 저장이 되는데 그건 인간 중심적인 코드 언어이다.

|

compiler가 compile 을 해주면

|

실행가능한 파일은 .class 로 만들어진다. (0, 1 의 기계어인 byte code로 컴퓨터가 이해할 수 있는 언어로 변환된 파일)

 

그리고 그 .class 파일들은 out 이라는 폴더에 production이라는 폴더에 프로젝트 이름과 같은 폴더에 만들어진다.

즉,

projecct_name/src/Class_name.java  -->    projecct_name/out/production/project_name/Class_name.class

이렇게 된다는 것.

 


이 강의가 좋은 이유가, 굉장히 이해하기 쉽게 잘 설명해준다는 것. 그래서 실습까지 나아가는데 이론을 배우는 시간이 길지만 그래도 이론을 잘 설명해주니까 실습도 잘 이해가 되어서 좋은 강의라고 생각한다.