오늘 배울 내용은 자바의 기초 문법 중 타입, 변수, 상수형 변환, 연산자, 입/출력, 제어문(조건문, 반복문)
실제로 움직이는 소프트웨어 만들기 위해 코드 잘 작성하는 것이 중요
Write Once, Run Anywhere
국내 전자정부 프레임워크 등에 가장 보편적으로 사용되는 언어
[자바의 특징]
운영체제에 독립적. JRE 설치된 모든 운영체제에서 실행 가능 (JRE : JVM 자바 가상머신 + 표준 클래스 라이브러리)
객체 지향 언어 모든 기능은 객체로 만들어 사용. 유지보수가 쉽고 확장성 높음
함수형 프로그래밍 지원 (람다, 스트림. 컬렉션의 요소를 필터링, 매핑, 집계처리 용이. 코드 간결)
자동 메모리 관리 (가비지 컬렉터로 사용하지 않는 메모리 수거)
[JVM과 JDK]
컴파일 : 특정 프로그래밍 언어를 기계가 이해할 수 있는 언어로 옮기는 과정
JVM(Java Virtual Machine) : 자바 프로그램을 실행하는 도구. 자바 코드로 작성한 프로그램을 해석해 실행하는 프로그램. 서로 다른 운영체제에서 프로그램을 실행 가능
JDK : JRE + 개발에 필요한 도구
[Hello World]
public class Main {
public static void main(String[] args) {
}
}
내용을 입력하세요.
void main(String[] args) { }
-> 이를 간단히 표현하면 A main (C D) {D} : 메서드를 정의하는 문법
(메서드 : 클래스 내에 포함된 함수. 일정 기능을 수행하기 위한 코드들의 묶음 <-> 함수 : 특정 기능을 수행하는 코드를 묶은 것
자바는 객체지향 언어. 모든 클래스를 클래스 내에 작성. 함수보다는 메서드라는 용어를 사용)
A : 반환 타입
B : 매개변수의 타입 (매개변수 : 외부에서 받은 값을 저장하고 있는 변수)
C : 매개변수의 이름
D : 메서드 바디
메서드 정의 후 메서드 호출
기억하고자 하는 값이 차지하는 메모리 공간 크기 파악 -> 메모리 공간 확보 -> 값 저장 -> 값 저장한 공간에 이름 붙임 (변수)
public class Example {
public static void main(String[] args) {
int num; // 변수 선언. int 4byte 메모리 차지
num = 1; // 값 할당 (초기화)
num = 2; // 값 할당 (재할당)
/*
또는 변수 선언하면서 동시에 초기화 가능
int num = 1;
*/
int 4byte 메모리 차지
[변수 명명 규칙]
변수 이름 지을 때 카멜 케이스 사용 (두 번쨰 단어부터 대문자 사용)
영문자(대소문자 구별), 숫자, _, $ 사용 가능
불가 : 숫자로 시작, 예약어
참고 사이트 https://www.oracle.com/java/technologies/javase/codeconventions-namingconventions.html
[상수]
재할당 금지 변수. final 키워드로 선언. 대문자에 _언더바 넣어 구분
값이 변하면 안되는 경우에 사용.
[타입]
어떤 값의 유형과 종류. 타입에 따라 값이 차지하는 메모리 공간의 크기, 값이 저장되는 방식이 달라짐
기본 타입 : 실제 값 저장. 정수 타입(byte, short, int, long), 실수 타입(float, double), 문자 타입(char), 논리 타입(boolean)
참조 타입 : 데이터 저장된 곳 나타내는 주소값 저장.
public class TypeExample {
public static void main(String[] args) {
int primitive = 1;
Object reference = new Object();
System.out.println(primitive); // 1 기본타입변수 (변수 값)
System.out.println(reference); // java.lang.Object@e580929 참조타입변수 (메모리 주소)
}
}
[리터럴]
문자가 가리키는 '값' 그 자체
변수 또는 상수에 할당 가능
int currnetAge = 20; // 정수형 리터럴 20을 정수형 변수 currentAge에 할당
double pi = 3.14159; // 실수형 리터럴 3.14159를 실수형 변수 pi에 할당
boolean isGenius = true; // 논리형 리터럴 true를 논리형 변수 boolean에 할당
char firstAlphabet = 'A'; // 문자형 리터럴 'A'를 문자형 변수 firstAlphabet에 할당
String leanedAt = "CodeStates"; // 문자형 리터럴 "CodeStates"를 문자열 타입 변수 learnedAt에 할당
float 타입의 변수에 할당시 리터럴 뒤에 접미사 f
long 타입의 변수에 할당시 리터럴 뒤에 접미사 L (숫자와의 혼동 방지 위해 대문자 사용)
float weight = 43.2f
final long LIGHT_YEAR = 2093942432L;
[정수 타입] byte, short, int, long (크기 오름차순)
byte : 1byte (-128(-27) ~ 127(27 - 1)
short : 2byte (-32,768(-215) ~ 32,767(215 - 1)
int : 4byte (-2,147,483,648(-231) ~ 2,147,483,647(231 - 1))
long : 8byte (-9,223,372,036,854,775,808(-263) ~ 9,223,372,036,854,775,807(263 - 1))
-1씩 해주는 이유 : 부호를 나타내기 때문 (맨 앞 비트가 0이면 양수, 1이면 음수)
오버플로우 : 각 타입의 표현범위 최대값 이상인 경우 최소값으로 나타냄
언더플로우 : 각 타입의 표현범위 최소값 이하인 경우 최대값으로 나타냄
[실수 타입] - float, double
float : 4byte (음수 : -3.4 1038 ~ -1.4 10-45 . 양수 : 1.4 10-45 ~ 3.4 1038)
double : 8byte (음수 : -1.8 10308 ~ -4.9 10-324 .양수 : 4.9 10-324 ~ 1.8 10308)
double 이 float보다 더 큰 실수 저장. 더 정확
오버플로우 : 무한대
언더플로우 : 0
(정수형과 실수형 일 떄 오버/언더플로우 결과 다름!)
[논리형] boolean
true 또는 false
최소단위인 1byte값 (8bit)
[문자 타입] char
char - 2byte
오직 하나의 문자형 리터럴 저장 -> 유니코드값 저장
큰따옴표(" ") 아닌 작은따옴표(' ') 사용
char letter1 = 'a'
char letter2 = 'ab' // 에러. 하나의 문자만 할당가능
char letter3 = "a" // 에러. 작은 따옴표 사용
[타입 변환]
boolean 제외 7타입 서로 타입 변환 가능
byte(1) -> short(2)/char(2) -> int(4) -> long(8) -> float(4) -> double(8)
public class TypeVari {
public static void main(String[] args) {
long longValue = 12345L;
float floatValue = longValue; // float이 long보다 정밀. 자동 타입변환
System.out.println(floatValue); // 12345.0
int intValue = 128;
byte byteValue = (byte)intValue; // 수동 타입변환시 캐스팅 연산자 () 사용. ()안에 변환하고자 하는 타입
System.out.println(byteValue); // -128 오버플로우 발생
}
}
[문자열(String)]
큰 따옴표(" ")로 감싸진 문자열
String name1 = "Kim Coding"; // 문자열 리터럴을 String 변수 name에 할당
String name2 = new String("Kim Coding"); // String 클래스의 별개의 인스턴스 생성 (주소값 새로 부여)
클래스는 거푸집. 거푸집을 통해 찍어낸 것이 인스턴스. 클래스로 인스턴스 찍어낼 때 new 연산자 사용
선언 : String 변수명;
변수에 문자열 할당 : 변수 = "문자열"; 또는 변수 = new String("문자열")
== 등가 연산자 : 값 또는 변수가 값으면 true, 다르면 false
equals() 메서드 : 문자열 내용 같으면 true, 다르면 false
[String 클래스의 메서드]
charAt() : 해당 문자열의 특정 인덱스 문자 반환
compareTo() : 해당 문자열을 사전 편찬수로 비교
concat() : 해당 문자열 뒤에 시로 추가한 문자열 반환
indexOf() : 특정 문자/문자열이 처음 등장하는 위치의 인덱스 반환
trim() : 해당 문자열의 맨 앞과 맨 뒤에 포함된 모든 공백문자 제거
toLowerCase() 와 toUpperCase() : 모든 문자를 소문자로 / 대문자로 변환
참고 사이트 https://www.javatpoint.com/understanding-toString()-method
[StringTokenizer]
int word.length() 글자 수 세기
[연산자 (Operator)]
+
-
*
/ (나누기) 0으로 나누면 에러
% (나머지) 0으로 나누면 에러
num1 = num1 + 1; // 또는 num1++; 또는 ++num1;
num2 = num2 - 1; // 또는 num2--; 또는 --num2;
내용을 입력하세요.
증감 연산자의 위치에 따라 연산 순서 달라짐
++num; - 전위형 증감연산자. 증감 연산자 먼저 수행 후 결과값 적용
num++; - 후위형 증감연산자. 기존 값 먼저 적용 후 증감 연산 수행
num1 = num1 + 2; ->>> num1 += 2;
num2 = num2 - 2; ->>> num2 -= 2;
[비교 연산자]
[논리 연산자]
[연산자 우선순위]
콘솔 입출력(I/O)
System.out.print() 단순 출력. 줄바꿈X
System.out.println() 출력 후 줄바꿈
System.out.printf() 형식대로 출력