Java
Java는 1995년에 발표된 객체 지향 프로그래밍 언어로 C#과 문법적 성향이 굉장히 비슷하다.
Write Once, Run Anywhere 말그대로 언어코드를 한 번 작성하면 이 JVM이 설치된 어떤 OS에서도 동일하게 실행된다.
( 자체적인 바이트코드 형식(.class)으로 변환 / JVM(Java Virtual Machine)을 이용해 해석하는 하이브리드 언어)
-
JDK(Java Development Kit) 다운로드 : Window MSI Installer
-
IntelliJ 다운로드 : 이전엔 커뮤니티 버전(무료)이 있었으나 통합됨(무료는 동일/추가 유료 구독제)
-
학습 추천 자료 : C++과 비교하며 설명된 점프 투 자바 무료 공개본
특징
-
Object-oriented(객체지향) : 원시 자료형(int/float/long/boolean)을 제외한 모든게 Object(객체) Class에서 파생된다.
-
Multithreaded(멀티스레드 지원) : 멀티 프로세서 하드웨어를 지원하도록 설계되어 있다.
-
Simple(간단함) : C++에 가깝지만 고급 언어 요소에서 불필요하다 판단되는 요소들을 모두 제거하여 간단하다.
-
Robust(강력한) : 포인터 연산 지원 X, 자바 시스템이 모든 메모리를 자동으로 관리하는 방식을 채택하고 있어 프로그래머가 메모리 누수를 걱정할 필요없다.
-
Interpreted(해석형) : JVM을 이용해 시스템과 상관없는 바이트 코드를 해석하기때문에 컴파일 언어에 가까운 속도와 독립성 플랫폼 독립성을 확보할 수 있었다.(Interpreted 언어의 장점)
-
Secured(안전한) : 자료형 타입에 민감하여 일단 컴파일만 되면 실행할 때 오류 발생률이 다른 언어에 비해 현저히 낮다.(Compiled 언어의 장점)
C++ 문법간 차이점
-
포인트 연산지원 및 메모리 관리를 시스템에서 자동적으로 처리한다.
-
C++, Python 등 많은 언어들이 클래스의 다중 상속을 지원하지만 자바는 다중 상속을 지원하지 않는다.
-
Namespace와 같은 개념을 Java에선 Package로 사용된다.
-
C#/C++ 의 대표적 IDE인 Visual Studio 와 같이 Java에는 IntelliJ 가 있다.
-
객체간 ‘==’ 연산자는 C++처럼 실제값 비교대신 주소값(참조)을 비교한다. ( 대신 equals() 메서드를 이용한다. )
| 항목 | Java | C++ |
|---|---|---|
| 실행 방식 | JVM 위에서 실행 (바이트코드) | 기계어로 직접 컴파일 |
| 메모리 관리 | GC 자동 관리 | 개발자 직접 관리 (new/delete) |
| 포인터 | 없음 (참조만 존재) | 있음 (포인터 직접 조작) |
| 플랫폼 | OS 무관 (JVM만 있으면) | OS/아키텍처마다 재컴파일 필요 |
| 실행 속도 | 약간 느림 (JVM 오버헤드) | 빠름 (네이티브 실행) |
| 다중상속 | 인터페이스로만 가능 | 클래스 다중상속 가능 |
| 헤더 파일 | 없음 | .h 헤더 파일 필요 |
| 연산자 오버로딩 | 불가 | 가능 |
| 소멸자 | 없음 (GC가 처리) | ~Destructor() 직접 정의 |
| 템플릿 / 제네릭 | 제네릭 (<T>) |
템플릿 (template<typename T>) |
| 빌드 도구 | Gradle, Maven | Make, CMake |
| 주요 사용처 | 백엔드, Android | 게임엔진, 시스템, 임베디드 |
| null 안전성 | 런타임 NPE 위험 | 컴파일 타임 일부 체크 |
| 문자열 | String 객체 (불변) |
std::string (가변) |
| 접근 제어 | public private protected |
동일 + friend 키워드 |
SpringBoot
Node.js의 Express.js 와 같이 생산성 향상에 도움을 주는 프레임워크 Spring과 이러한 Spring에서 기본 환경설정을 쉽게 해주는 SpringBoot 이다.
-
Project : 빌드 툴 선택 ( 대부분의 프로젝트는 비교적 최신 업데이트 되는 Gradle을 사용)
-
Language : 프로젝트에 사용하고자 하는 프로그래밍 언어 선택
-
Spring Boot : 스프링 부트의 버전 선택
- SNAPSHOT : 아직 개발이 완료되지 않은 버전
- M(Milestone) : 개발은 완료되었으나, 기능 개선/버그 수정중인 버전
- RC(Release Candidate) : 기능 개선/버그 수정이 완료되었으나, 최종적으로 릴리즈되지는 않은 버전
-
Project Metadata : 프로젝트의 정보 입력
- Group : 프로젝트를 만드는 그룹의 이름으로, 보통 기업의 도메인 명을 역순으로 입력
- Artifact : 빌드 결과물의 이름
- Name : 프로젝트의 이름
- Description : 프로젝트에 대한 간략한 설명
- Package name : 프로젝트에 생성할 패키지를 설정
- Packaging : 배포를 위해 프로젝트를 압축하는 방법을 선택
- Java : 여러분의 PC에 설치된 JDK의 버전을 선택
-
Dependencies : 애플리케이션의 동작에 필요한 외부라이브러리 선택(종속성 자동 관리)
설정 완료 이후 Generate를 통해 파일을 다운받아 IDE(IntelliJ)로 파일을 열어 진행!
Express와의 개념 대응표
| 역할 | Express (Node.js) | Spring Boot (Java) |
|---|---|---|
| 앱 초기화 | express() |
@SpringBootApplication |
| 라우터 | app.get('/path', handler) |
@GetMapping("/path") |
| 요청 객체 | req.body |
@RequestBody |
| 응답 객체 | res.json() |
ResponseEntity |
| 미들웨어 | app.use(middleware) |
Filter, Interceptor |
| 비동기 처리 | async/await |
@Async, Kotlin 코루틴 |
| ORM | Sequelize, Prisma | Spring Data JPA |
| 환경 변수 | .env |
application.properties / application.yml |
| 라우터 분리 | express.Router() |
@RestController |
| 에러 핸들러 | app.use((err, req, res, next) => {}) |
@ControllerAdvice |
| 의존성 관리 | package.json (npm) |
build.gradle (Gradle) |
| 서버 실행 | app.listen(3000) |
내장 Tomcat 자동 실행 |
한줄 평
- 내일 첫 미팅이 진행될 예정이다. 두근되면서도 떨린다..!