Java 기초 (1)
1. Java
Java 언어란?
- C언어 기능에 여러 기기에서 실행 가능하도록 도와주는 공통실행 환경(JVM), 데이터와 메서드를 담는 클래스, 이 클래스를 통해 객체를 만들 수 있는 언어
- 쉽게말해 C언어 기능 + 자바만의 편의성(공통실행 환경(JVM), 클래스, 객체)
Java의 장점 5가지
1. 공통실행환경(JVM)이 있어서 여러 기기에서 실행 가능하다.
- 기기가 프로그램을 실행시키는 다양한 운영환경(ex. window, mac, android, ios 등)에서 사용 가능하다.
2. 현실세계와 비슷한 구조로 이해하고 유지보수하기 쉽다.
- 객체지향적인 프로그래밍 언어로 현실세계와 비슷한 구조.(이후에 자세히 설명.)
3. 안정성이 높고 보안상 안전하다.
- 컴파일러가 오류를 체크해서 안정성이 높음.
- 자바에서 지원하는 보안기술들이 많이있어 보안성이 높음.
4. 대규모 앱개발이 가능하다.
- API를 통해서 네트워크 및 데이터베이스를 처리해줘서 대규모 앱개발이 가능하다.
5. 자바의 다양한 개발도구와 라이브러리를 사용할 수 있다.
- 이를 통해 앱 개발에 필요한 작업을 쉽게 처리할 수 있다.
공통실행환경(JVM)
Java Virtual Machine = 자바 가상 머신 = 가상의 기기를 만들어 준다.
즉, 여러가지 기기(운영체제) 위에 자바 프로그램을 실행시킬 수 있는 가상의 기기를 만들어 주는것을 의미한다.
JVM이 없다면 디바이스 별로 환경을 일일히 설정해 줘야한다.
JVM 구성
1. 바이트코드
- 자바 프로그램 변환 코드
- 자바 컴파일러가 내가 작성한 자바코드를 운영체제가 읽을 수 있는 코드로 변환한 코드
2. 인터프리터
- Java .class 코드해석기
- 운영체제가 읽은 바이트 코드를 기기가 실행할 수 있는 기계어로 번역
3. JIT 컴파일러
- 빠른 Java .class 코드해석기
- 인터프리터의 효율을 높여주는 서포터 해석기
4. 메모리 영역
- 자바 데이터를 저장하는 영역
- 운영체제로부터 JVM이 할당받은 메모리 영역
5. 클래스 로더
- Java .class 바이트 코드를 메모리 영역에 담는 운반기
- JVM으로 바이트코드를 불러와서 메모리에 저장함
6. 가지비 컬렉터
- 자바 쓰레기 청소기
- 메모리 영역에 안 쓰는 데이터를 주기적으로 치워주는 청소기
JVM의 동작순서
개발환경 구성
JRE
- 자바 실행환경
- .class파일만 실행 가능
JDK
- 자바 개발 키트
- JRE(JVM)기능을 포함하고 있음
- .java파일을 .class파일로 변환해주는 자바 컴파일러 기능이 있음
- 디버깅 기능이 있음
디버깅?
- 작성한 코드 라인에 '중단지점'을 설정하고 '디버그'모드로 실행하면, 프로그램이 중단지점의 코드라인을 실행할 때 프로그램 흐름이 일시정지되며 변수들을 볼 수 있게 도와줌
- 버그를 찾아낼때 의미있게 사용가능
→JDK를 사용해서 개발한다.
2. 클래스와 메소드
public class Main {
public static void main(String[] args) {
System.out.println("Hello world!");
}
}
클래스
앞서 얘기했듯 .java파일이 .class파일로 컴파일 된다. 그래서 클래스라는 키워드를 통해서 자바파일을 만든다.
public class Main{}
클래스의 예시 코드이다. 구조를 분석해보면
1. public - 접근제어자. 간단하게 클래스 경로 외부에서 접근(실행, 호출)이 가능한지 제어하는 역할. public은 가능, private, protected는 불가능 정도로만 우선 알아두자.
2. class - 객체를 만드는 '클래스' 임을 선언
3. Main : 클래스 명. 자바 파일명과 일치시켜주어야 한다.
클래스 명 뒤의 중괄호 내부에 하위요소들이 들어가게 된다.
메소드
클래스의 하위요소 그 중 main메소드는 필수 하위요소이다.
모든 프로젝트엔 main메소드가 반드시 있어야 한다. → 자바 프로젝트(앱)은 제일 먼저 클래스의 main메소드를 실행시킨다. 이 main메소드에 다른 클래스나 다른 객체를 불러오는 방식으로 프로젝트(앱)가 실행된다.
public static void main(String[] args) {
System.out.println("Hello world!");
}
main메소드의 예시 코드이다. 구조를 분석해 보면
1. public - 접근제어자(클래스에서 한 설명과 동일)
2. static - '이 프로그램이 시작될 때 무조건 실행이 된다는 의미'로 우선 이해하고 넘어가자.
3. void - 메서드의 출력값 타입. void : 비어있는, 없는 = 출력이 없다.
4. main - 메서드 명.
5. (String[] args) - 매개변수 자리 = 입력값타입과 변수 명. 해당 코드에서는 String[]타입의 args라는 이름의 변수가 매개변수(입력) 인것. 변수명은 원하는 아무 이름을 사용해도 상관없음.
이후 중괄호 내부에 하위요소가 들어가는것은 동일하다.
이 코드에서 중괄호 내부의 System.out.println("Hello world!"); 라는 코드는 간단하게 쌍 따옴표 안의 텍스트를 출력한다.
자주 쓰는 코드이므로 그냥 외우면 된다. (자바에서 sout + 엔터키를 사용하면 자동으로 입력할 수 있다.)
+ 코드에서 줄바꿔서 입력한다고 출력에서도 줄바꿈이 되는것이 아니다 println에서 ln이 줄바꿈을 의미한다. 즉, print로 코드를 작성하면 줄바꿈 없이 출력할 수 있다.
+ 숫자를 출력할땐 쌍 따옴표 없이 숫자를 입력해도 출력된다.
변수
변수란 '변할 수 있는 값'이다. 숫자만이 아니라 텍스트 같은 데이터들도 포함된다.
+ 변하지 않는 값인 상수도 존재하지만 편의상 저장공간 = 변수 라는 의미로 사용한다.
이런 변수를 저장하려면 저장할 공간이 필요하고 각 데이터 유형에 맞는 공간을 사용해야 한다.
저장공간을 만드는것을 '선언한다' 라고 표현한다.
변수선언
int number1 = 1;
int number2;
number2 = 2;
저장공간의 유형(변수 타입) + 저장공간의 이름(변수 명)으로 선언한다.
값을 저장하는 방법은 2가지가 있는데
1. 초기화 → [변수타입 + 변수이름 = 저장할 값] 을 한번에 선언
2. 덮어쓰기 → [변수타입 + 변수이름] 을 선언하고 이후 [변수이름 = 저장할 값]으로 덮어쓰기
변수 타입
크게 두가지로 구분된다.
1. 기본형 : 데이터 값 자체를 저장하는 방식
2. 참조형 : 데이터가 저장된 주소를 저장하는 방식
기본형 변수의 종류
1. boolean → 논리형 변수. true/false 두 가지 값만 저장
2. char → 문자형 변수 : 따옴표 안의 문자 한글자만 저장
3. byte, short, int long → 정수형 변수 : 정수를 저장. 변수타입의 순서대로 더 큰 값을 저장할 수 있음 + long은 저장할 값 뒤에 L을 붙여준다
4. float, double → 실수형 변수 : 소수점을 포함 한 실수를 저장. 변수타입의 순서대로 더 큰 값을 저장할 수 있음 + float는 저장할 값 뒤에 f를 붙여준다
참조형 변수의 종류
1. String → 문자열 변수 : 쌍따옴표 안의 문장을 저장
2. Object, Array, List... → 객체, 배열, 리스트와 같은 단일 저장공간에 담을 수 없는 값을 저장
+ 래퍼클래스 변수
기본형 변수를 클래스로 한번 랩핑한 변수
기본형 변수 타입명에서 첫글자를 대문자로 바꿔서 선언 ex) long → Long, int → Integer
클래스는 객체지향 언어인 자바의 핵심기능으로 클래스로 변수를 관리하면 객체지향의 많은 기능을 사용할 수 있게됨.
// 변수선언과 사용예시
boolean a = true;
char b = 'A';
int num1 = 1;
double num2 = 3.14;
String c = "hello";
System.out.println(a);
System.out.println(b);
System.out.println(num1);
System.out.println(num2);
System.out.println(c);
// 실행결과
true
A
1
3.14
hello
사용자에게 입력값 받기 & 출력
사용자로부터 입력값을 받기 위해 Scanner를 사용한다.
Scanner sc = new Scanner(System.in); // Scanner 객체를 new 명령어로 생성합니다.
System.out.println("값을 입력하세요 : ");
String input = sc.next(); // 입력받을 값의 변수타입으로 변수선언 + .next() 사용
System.out.println(input);
//실행결과
값을 입력하세요 : // 이 문장이 출력됐을 때 원하는 값을 입력 + 엔터키
hello // 내가 입력한 값 출력
형 변환
수동 형변환
1. 실수 → 정수
2. 정수 → 실수
// 1. 실수 → 정수
double doubleNum = 10.1010;
int intNum = (int)doubleNum;
// 2. 정수 → 실수
int intNum2 = 10;
double doubleNum2 = (double)intNum2;
System.out.println(intNum);
System.out.println(doubleNum2);
// 실행결과
10
10.0
자동 형변환
1. 작은 변수타입의 값을 큰 변수타입에 저장하면 자동으로 형변환이 진행됨
2. 큰 변수타입의 값을 작은 변수타입에 저장하면 자동으로 형변환이 진행되지만 손실되는 데이터가 생김(강제 형변환)
//작은타입 -> 큰타입
int intNum2 = 10;
double doubleNum2 = intNum2;
System.out.println(doubleNum2);
// 실행결과
10.0
실습
System.out.println("요리메모장 만들기");
String title = ("알리오올리오 파스타 만들기");
double rating = 5.0;
String recipe1 = ("마늘, 페퍼론치노를 다져놓고 베이컨을 1cm두께로 자른다.");
String recipe2 = ("물 500ml에 소금 5g을 넣고 끓인다.");
String recipe3 = ("물이 끓으면 파스타 면을 겹치지 않게 넣고 8분간 삶는다.(파스타 면들 100원 동전크기만큼 잡으면 대충 1인분이다.)");
String recipe4 = ("면이 끓는동안 중불의 팬에 올리브오일을 두르고 베이컨을 볶는다.");
String recipe5 = ("베이컨이 익으면 마늘과 페퍼론치노를 넣고 마늘이 갈색이 되기 직전까지 볶는다.");
String recipe6 = ("팬에 면수를 1국자와 면을 넣고 불을 약불로 줄인다.");
String recipe7 = ("면을 저어가며 소스를 잘 흡수시킨다. 오일이 많으면 면수를 약간씩 추가한다.");
String recipe8 = ("소스가 2숟가락 남을정도로 섞어줬다면 완성");
System.out.println("[" + title + "]");
System.out.println("별점 : " + rating);
System.out.println("1." + recipe1);
System.out.println("2." + recipe2);
System.out.println("3." + recipe3);
System.out.println("4." + recipe4);
System.out.println("5." + recipe5);
System.out.println("6." + recipe6);
System.out.println("7." + recipe7);
System.out.println("8." + recipe8);
// 실행결과
[알리오올리오 파스타 만들기]
별점 : 5.0
1.마늘, 페퍼론치노를 다져놓고 베이컨을 1cm두께로 자른다.
2.물 500ml에 소금 5g을 넣고 끓인다.
3.물이 끓으면 파스타 면을 겹치지 않게 넣고 8분간 삶는다.(파스타 면들 100원 동전크기만큼 잡으면 대충 1인분이다.)
4.면이 끓는동안 중불의 팬에 올리브오일을 두르고 베이컨을 볶는다.
5.베이컨이 익으면 마늘과 페퍼론치노를 넣고 마늘이 갈색이 되기 직전까지 볶는다.
6.팬에 면수를 1국자와 면을 넣고 불을 약불로 줄인다.
7.면을 저어가며 소스를 잘 흡수시킨다. 오일이 많으면 면수를 약간씩 추가한다.
8.소스가 2숟가락 남을정도로 섞어줬다면 완성