Java, IntelliJ 실습
프로그래밍 언어
📌 프로그래밍 언어 왜 사용하는가?
- 컴퓨터와 사람 사이의 소통을 위해
- 컴퓨터는 0과 1만 이해할 수 있는데 사람이 대화를 시도함으로써 사람이 할 수 없는, 하기에는 오래 걸리는 일을 컴퓨터에게 반복해서 시키는 것.
🚗 개발 언어의 역사
시스템 : input이 들어가면 output이 나옴
- A언어
- 첫 개발 언어라는 의미, 1960년대, 입/출력 문맥
- B언어
- Bell사 개발, 1960년대, A언어 기능 + 기계식 데이터 타입, 연산 기능, 메서드
- C언어
- B언어에 비해 더 좋은 언어라는 의미, 1970년대, B언어 기능 + 자료형 데이터 타입, 자료구조.
- Java
- Java 마크에서 볼 수 있는 어디서나 마시는 커피처럼 어디서나 동작 가능한 언어, 1990년대
- C언어 기능 + 공통 실행환경(JVM), 클래스, 객체, 대표적인 객체지향 언어
Java의 유래는? ☕
- 자바의 창시자, 제임스 고슬링은 Sun 마이크로시스템즈의 프로젝트 일환으로 자바라는 언어를 만들었음.
자바는 자바 섬의 자바에서 유래하였고 제임스 고슬링은 하루에 자바 커피를 10잔씩 마시는 자바 커피 중독자였다고 함..!
자바는 처음에는 양뱡향 통신이 가능한 TV에 사용하기 위해 시작한 프로젝트였지만 언어 수준이 높아 오히려 TV에 적용할 수 없는 안타까운 상황이었음.
1996년 자바는
Write Once, Run Anywhere
이라는 모토로 1.0버전이 출시됨. 그 당시 C/C++ 스타일로 개발되었기 때문에 기존의 개발자들도 사용하기 쉬웠고 높은 안정성과 네트워크와 접근 권한을 직접 수정할 수 있어 보안성으로 좋은 언어였음.하지만 Java가 명성을 날린 것은 1998년 자바 애플릿을 통해 웹 브라우저 안에서 프로그램을 실행할 수 있게된 JAVA2 이후임. 자바 애플릿은 JAVA로 작성된 뒤 바이트 코드로 컴파일되어 브라우저 상에 존재하는 JVM을 통해 실행될 수 있음.
이전에는 정적 HTML만 보여줄 수 있었는데 자바 애플릿을 이용해 GUI, 멀티미디어, 계산, 다른 웹 서비스나 DB와 interactive한 소통 등 웹 페이지를 생각하면 할 수 있는 모든 기능들이 가능해짐.
Java 목표 🏆
- Simple, Object Oriented, and Familiar
- C++에서 불필요하게 복잡한 부분을 줄이고 객체지향적인 요소를 남기며 쉽게 언어에 친숙해질 수 있도록 노력함
C언어의 기능 + 필요한 기능을 추가한 것이기 때문
- C++에서 불필요하게 복잡한 부분을 줄이고 객체지향적인 요소를 남기며 쉽게 언어에 친숙해질 수 있도록 노력함
- Robust and Secure
- 컴파일 시점과 런타임 시점 모두 코드 검사를 하여 신뢰성이 높음. new 연산자를 통해 객체를 생성하고 포인터를 관리할 필요가 없어 메모리를 사용하기 쉬움. 자동적으로 시작하는 Garbage Collection으로 메모리 관리가 자동적으로 진행됨.
- Architecture Neutral and Portable
- Java는 다양한 OS와 다양한 프로그래밍 언어 인터페이스에서 사용할 수 있도록 설계하고자 함.
- High Performance
- Java는 인터프리터가 런타임 환경을 체크할 필요가 없어 성능 면에서 우수함. Garbage Collection을 수행하는 쓰레드는 낮은 우선순위로 운영되기에 효율적으로 메모리 운영을 하게 됨.
- Interpreted, Threaded, and Dynamic
Java Compiler 가 컴파일하여 나온 결과물인 바이트코드를 JVM 내부에 있는 인터프리터가 한 줄씩 읽어 실행하기 때문에 인터프리터만 존재하는 방식보다 속도가 빠름. 또한 멀티쓰레드 방식을 통해 concurrent하게 발생하는 일들을 한번에 처리할 수 있음.
Java의 클래스 간 연결은 사용하는 그 시점에 연결되기 때문에 동적으로 배정된다는 특징이 있음.
- 자바를 왜 배울까?
- 가장 많이 쓰이는 개발 언어 중 하나
- 공통 실행환경이 있어 여러 기기에서 실행 가능
- 여러 기기의 OS에서 실행할 수 있는 언어
- 대표적인 객체지향 언어
- 안정성이 높아 프로그래밍 오류를 방지하고 보안상 안전 ➡ 자바는 컴파일러(변환기)로 오류를 먼저 체크, 각종 보안 기술이 있음
- 대규모 앱 개발
- 자바를 배우면 다양한 개발 도구와 라이브러리를 사용할 수 있음
- 가장 많이 쓰이는 개발 언어 중 하나
- JVM
- 자바 가상 머신, 가상의 기기를 만들어주는 것을 의미
- 여러가지 기기 위에 java 프로그램을 실행시킬 수 있는 가상의 strong text기기를 만들어주는 것
- 바이트 코드
- java 프로그램 변환 코드, 내가 작성한 코드가 운영체제가 읽을 수 있는 코드(바이트 코드)로 자바 컴파일러가 변환한 코드
- 컴파일러 : java 파일을 class 파일로 변환
- 왜 변환해? : java 파일은 컴퓨터, 즉 운영체제가 읽을 수 없고 사람만 이해 가능. 운영체제가 이해할 수 있는 방법 : class
- java 프로그램 변환 코드, 내가 작성한 코드가 운영체제가 읽을 수 있는 코드(바이트 코드)로 자바 컴파일러가 변환한 코드
- 인터프리터
- java .class 코드 해석기, 운영체제가 읽은 바이트 코드를 기기(기계)가 실행할 수 있는 기계어로 번역
- JIT 컴파일러
- 빠른 java .class 코드 해석기, 빠르게 인터프리터의 효율을 높여줌
인터프리터와 JTP 컴파일러는 세트
- 메모리 영역
- Java 데이터를 저장하는 영역, OS로부터 JVM이 할당받은 메모리 영역
- 클래스 로더
- java .class 바이트 코드를 메모리 영역에 담는 운반기, JVM으로 .class를 불러와서 메모리에 저장함.
메모리 영역에 .class 파일을 class loader가 운반
- Garbage Collection
- Java 쓰레기 청소기, 메모리 영역에서 안 쓰는 데이터를 주기적으로 흡수해가는 청소기
- JRE(Java Runtime Environment)
Java의 놀이터인 JVM을 설치하는 방법은 JRE를 설치
- 자바 실행환경
- JRE만 있다면 Java 프로그램을 실행’만’ 실킬 수 있음.
- JRE는 .class 파일만 실행 가능
- JDK가 javac 명령을 통해 .java 파일을 실행가능한 .class 파일로 변환해줌
1
2
ex) 1. java -> class , 2. class 실행에서
JRE는 2번밖에 못함.
- JDK(Java Development Kit)
자바 개발 키트
- JRE 기능 포함 -> JRK 자바 실행환경을 가짐(Runtime 환셩)
- .java 파일들을 .class 파일들로 변환해주는 Java Compiler(javac) 기능이 있음 -> 컴파일러 역할
코드를 디버깅하는 jdb 등의 기능
- 디버그 : de+bug : 코드를 면밀히 살펴보는 과정을 통해 나쁜 것(벌레)을 없애는 것
IntelliJ 💻
FirstJava -> source 코드 약자 src -> Main.java
디버깅 하는 방법 : 버그를 없애기 위해 면밀히 코드를 살펴보는 과정, 몇 번째 코드를 면밀히 살펴볼 것인지 언급해야 됨.
- 8번째 줄을 면밀히 살펴보고 싶음
- 해당 디버그 버튼 클릭 -> 결과로 변수가 무엇을 지칭하는지, 팝업 형태 등을 보여줌
.java 파일이 앞으로 .class 파일로 컴파일 됨.
이 말은 java 파일을 만들었지만 안에 들어가는 실제 모양은 .class 파일로 됨. Main이라는 class를 만들고 class loader로 메모리 영역으로 실어가서 실행
모든 프로젝트를 만들 때 main 메서드가 있어야 됨. java 프로젝트(앱)는 제일 먼저 클래스 Main 메서드를 실행시킴 -> JVM의 약속
public : 제어자, (공공의, 공통의), public 으로 Main 클래스를 만들어 놓으면 src 폴더의 Main 클래스는 어디서든 접근 가능함.
- Main 클래스의 이름은 .java 클래스의 이름과 동일하게 일치 시켜줘야 됨.
- static : 이 프로그램이 시작될 때 무조건 실행됨.
▶ output
- void : 메서드의 출력값의 데이터 타입, void는 ‘아무것도 없다’ -> 출력이 없는 메서드
▶ input
String[] args : 매개변수 자리
객체 : 특징(속성, 변수), 행동(메서드)
- 변수
- 변하는 것(변수), 변하지 않는 것(상수)
- 기본형 변수
논리형 변수 : boolean -> true(1), false(0)
- 문자형 변수 : char -> ‘A’, ‘1’ 와 같은 문자 하나만 저장, ‘ ‘ (따옴표 1개로 감싸줌)
- 정수형 변수 : byte(1byte), short(2byte), int(4byte), long(8byte)
- 실수형 변수 : float(4byte), double(8byte)
실수는 표현 범위가 매우 넓어서 정수형 변수에 담지 못할 수 있음
float 가 long보다 더 넓은 범위를 표현하기 때문에 자동 형변환이 안됨
컴퓨터 – 고정소수점, 부동소수점
고정소수점 : 뒤에 나올 소수점의 길이를 미리 제한, 고정해 놓은 것
부동소수점 : 부호, 지수부, 기수부를 저장해 놓고 이값들을 곱한 값을 저장(표현)하는 방식
float 형의 예시 float fnum = 0.123f
-> 여기서 데이터값(리터럴) 뒤에 붙이는 구분 값을 “접미사”라고 함
참조형 변수
- 문자열 변수 : String -> “Apple”,“텍스트”와 같은 문장을 저장 , 쌍따옴표사용
Object, Array, List -> 객체, 배열, 리스트와 같은 단일 저장공간에 담을 수 없는 값을 저장
래퍼 클래스 변수 : weapper Class라는 말 그대로 “기본형 변수를 클래스로 한번 랩핑하는 변수”
- 문자 : 문자 뒤에 \0(널문자)가 없음
- 문자열 : 문자 끝에 \0(널문자)가 함께 저장.
자동 형변환 vs 강제 형변환
작은 타입 > 큰 타입 형변환시 (자동 형변환)
큰 타입 > 작은 타입 형변환시 (강제 형변환 = 캐스팅)
- stack 영역 : 정적으로 할당된 메모리 영역
- Heap 영역 : 동적으로 할당된 메모리 영역
동적 : 알 수 없을 때