JAVA란?
1996년에 나온 객체 지향 프로그래밍 언어(Object Oriented Programming, OOP)
운영체제에 독립적으로 실행 가능 → 다양한 운영체제가 공존하는 웹 환경에 적합한 언어로 지금도 전세계적으로 많이 쓰이는 언어
‘Write Once, Run Anywhere’ 슬로건으로 빠르게 많은 사용자 확보함
자바의 특징
운영체제에 독립적
객체지향언어 (OOP)
함수형 프로그래밍 지원
자동 메모리 관리(Garbage Collection)
JVM과 JDK
JVM (Java Virtual Machine)
- 자바 프로그램을 실행시키는 도구
- JRE(Java Runtime Environment, 자바 실행 환경)이나 JDK(Java Development kit, 자바 개발 키트)를 설치하면 자동으로 설치
- 자바가 운영체제에 독립적인 건 JVM 때문에 가능
- 자바 코드로 작성한 프로그램을 해석해 실행하는 별도의 프로그램
- JVM을 거치기 때문에 자바는 C/C++ 보다는 속도가 느린 편 이지만 JVM 내부의 최적화된 JIT(just-in-time) 컴파일러를 통해 속도를 크게 개선
참고) JIT(Just-int-tim) 컴파일 이란?
동적 번역(dynamic translation)이라고도 함
프로그램을 실제 실행하는 시점에 기계어로 번역하는 컴파일 기법
컴퓨터 프로그램을 만드는 방법은 크게 두가지 (인터프리트 방식과 정적 컴파일 방식)
인터프리트 방식은 실행 중 프로그래밍 언어를 읽어가면서 해당 기능에 대응하는 기계어 코드를 실행
정적 컴파일은 실행하기 전에 프로그램 코드를 기계어로 번역
JIT 컴파일러는 두가지 방식을 혼합한 방식, 실행 시점에 인터프리트 방식으로 기계어 코드를 생성하면서 그 코드를 캐싱하여 같은 함수가 여러번 불릴 때 매번 기계어 코드를 생성하는 것을 방지
JDK (Java Development Kit)
JRE : JVM + 표준 클래스 라이브러리
JDK : JRE + 개발에 필요한 도구
JDK는 OracleJDK와 OpenJDK 가 있음
클래스(class)
자바는 객체 지향 언어이기 때문에 모든 코드는 클래스 내에 작성
클래스는 쉽게 말하면 객체를 찍어낼 수 있는 툴
main 메서드
메서드란? 클래스 내부에 정의된 함수
자바로 만든 프로그램은 실행 시 main 메소드를 가장 먼저 실행
public static void main(String[] args){
//코드
}
자바의 접근 제어자(Access Modifier)
public > protected > default > private
public : 모든 접근 허용
protected : 같은 패키지(폴더)에 있는 객체와 상속 관계의 객체들만 접근 가능
default : 같은 패키지(폴더)에 있는 객체들만 접근 가능
private : 같은 클래스 내에서만 접근 가능
static
메소드가 객체마다 속한 것이 아닌 클래스 자체에 속한 것임을 지정하는 키워드
return과 void
자바의 메소드는 리턴 값의 타입을 명시해줘야함
return 값이 없을 경우 return을 생략하거나 return만 쓰거나 아무것도 없다는 의미에서 return void 키워드 사용
자바의 타입(Type)
기본 타입(primitive type)
- 데이터의 실제 값을 의미함
- 정수 타입, 실수 타입, 문자 타입, 논리 타입
참조 타입(reference type)
- 데이터가 저장된 주소값을 담고있음
- 기본형을 제외한 나머지 타입
정수 타입 (Integer Type)
맨 앞은 부호 비트이고 나머지 비트에 숫자를 이진수로 표현함
ex) 1byte에 맨 앞을 제외한 7bit 를 이용해서 나타낼 수 있는 숫자는 2^7 (256) 개
양수와 음수를 모두 표현해야 하므로 양수 0~127(128개) + 음수 -1 ~ -128(128개) 까지 표현 가능
타입 | 메모리 | 범위 | 기타 |
byte | 1byte | -128(-2^7) ~ 127(2^7 - 1) | 1byte = 8bit |
short | 2byte | -32,768(-2^15) ~ 32,767(2^15 - 1) | |
int | 4byte | -2,147,483,648(-2 ^31) ~ 2,147,483,647(2^31 - 1) |
integer(정수)의 약자 기본적으로 정수는 int형을 사용 |
long | 8byte | -9,223,372,036,854,775,808(-2^63) ~ 9,223,372,036,854,775,807(2^63 - 1) |
변수에 값 할당할 때 long 형이라고 컴퓨터에 알려주기 위해서 값 뒤에 L이나 l을 붙여야함(안 붙이면 오류!) |
실수 타입
float와 double
- float : 4byte
- double : 8byte
실수형 값 뒤에 float 형이면 F 또는 f , double 형이면 d를 붙여야 하지만 double은 실수 기본형이기 때문에 d 생략 가능
자바는 실수형을 저장할 때 부동소수점 표현방식 사용 → 소수점을 더 정밀하게 표현할 수록 오차 줄어듬
논리 타입
boolean형
true 또는 false 값만 가질 수 있음
JVM이 다룰 수 있는 데이터 최소 단위가 1byte 이기 때문에 boolean 형은 1byte 차지
문자 타입
char형(character)
단 하나의 문자만을 저장할 수 있음
자바는 유니코드에 기반하여 문자를 표현하기 때문에 하나의 유니코드를 저장 (2byte)
문자를 변수에 저장하면 문자에 해당하는 유니코드 값이 저장됨
변수 값은 유니코드 값으로 저장해도 되고 'A' 처럼 작은 따옴표 안에 문자 직접 넣어서 저장할 수도 있음
※ char형 정수형으로 변환하기
// char형의 숫자를 int형으로 변환하는 방법
char ch1 = '9';
int temp = ch1 - '0'; // 57 - 48 = 9
int형을 char로 변환할 때는 반대로 + '0' 해주면 됨
String
String은 문자열을 저장할 수 있는 클래스
참조 타입
String = " "
큰따옴표 안에 저장할 문자열 입력
String 타입을 선언하고 저장하는 여러가지 방법
String str1;
str1 = "문자열"; // 문자열 리터럴을 대입하는 방식
String str2 = "문자열"; // 문자열 초기화
String str3 = new String("문자열"); // new 연산자를 사용해서 객체를 생성 후 대입
System.out.println(str1 == str2); // true
System.out.println(str2 == str3); // false
str1과 str2은 같은 리터럴이기 떄문에 같다고 나오지만 str3은 새로운 String 객체를 만들어서 저장했기 때문에 주소값이 다르므로 false
대표적인 String 메소드
메소드 | 설명 |
char charAt(int index) | 해당 문자열의 특정 인덱스에 해당하는 문자를 반환함 |
int compareTo(String str) | 해당 문자열을 인수로 전달된 문자열과 사전편찬 순으로 비교함(전달된 문자열보다 작으면 음수, 크면 양수, 같으면 0) |
int compareToIgnoreCase(String str) | 해당 문자열을 인수로 전달된 문자열과 대소문자 구분없이 사전편찬 순으로 비교함 |
String concat(String str) | 해당 문자열의 뒤에 인수로 전달된 문자열을 추가한 새로운 문자열을 반환함 |
int indexOf(int ch) / int indexOf(String str) / int indexOf(char ch, int fromIndex) / int indexOf(String str, int fromIndex) |
해당 문자열에서 특정 문자나 문자열이 전달된 인덱스 이후에 처음으로 등장하는 위치의 인덱스를 반환함 (찾을 수 없으면 -1) |
int lastindexOf(char ch) / int lastIndexOf(char ch, int fromIndex) |
해당 문자열에서 특정 문자가 전달된 인덱스 이후에 마지막으로 등장하는 위치의 인덱스를 반환함 |
String[] split(String regex) | 해당 문자열을 전달된 정규 표현식에 따라 나눠서 반환함 |
String substring(int begin) / String substring(int begin, int end) |
해당 문자열을 전달된 인덱스 만큼 잘라서 새로운 문자열을 반환함 |
String toLowerCase() / String toUpperCase() |
Lower은 모든 문자열을 소문자로 변환 / Upper은 모든 문자열을 대문자로 변환 |
String trim() | 해당 문자열의 맨 앞과 맨 뒤에 포함된 모든 공백문자를 제거 |
length() | 해당 문자열의 길이를 반환함 |
isEmpty() | 해당 문자열의 길이가 0이면 true 반환 / 아니면 false 반환 |
StringTokenizer
문자열을 지정한 구분자로 쪼개주는 클래스
쪼개진 문자열을 토큰(Token)이라고 부름
실행하기 위해서는 java.util.StringTokenizer를 import 해야함
import java.util.StringTokenizer;
public class StringMethod {
public static void main(String[] args) {
// StringTokenizer 클래스 연습
String str = "This is a string example using StringTokenizer";
StringTokenizer tokenizer = new StringTokenizer(str);
System.out.println(str);
// int countTokens() : 남아있는 token의 개수를 반환
System.out.println("total tokens:" + tokenizer.countTokens());
// boolean hasMoreElements(), boolean hasMoreTokens() :
// 현재 위치 뒤에 있는 문자열에서 하나 이상의 토큰을 사용할 수 있는 경우 true 반환
// 그렇지 않을 경우 false 반환
// StringTokenizer 내부적으로 어떤 위치의 토큰을 사용하였는지 기억
while (tokenizer.hasMoreTokens()) {
// Object nexElement(), String nextToken() : 다음의 토큰을 반환, 반환형이 다름
System.out.println(tokenizer.nextToken());
}
System.out.println("total tockens: " + tokenizer.countTokens());
}
}
<실행결과>
This is a string example using StringTokenizer
total tokens:7
This
is
a
string
example
using
StringTokenizer
total tockens: 0
StringBuilder
한번 생성된 String 클래스의 인스턴스는 문자열을 더할 때마다 새로운 인스턴스를 생성해야함
문자열을 더할 때 편리한 클래스
public class StringMethod {
public static void main(String[] args) {
// StringBuilder 클래스 : 문자열을 쉽게 연결
StringBuilder stringBuilder = new StringBuilder();
// append(String str) method로 문자열 연결
stringBuilder.append("문자열 ").append("연결");
// 변수에 넣거나 출력시 toString() method 사용
String example = stringBuilder.toString();
System.out.println(stringBuilder);
System.out.println(example);
}
}
<실행결과>
문자열 연결
문자열 연결
StringBuffer
String 클래스는 인스턴스의 값을 읽기만 할 수 있고, 변경할 수는 없음
인스턴스의 값을 변경, 추가할 때 편리한 클래스
1. append() 메소드
인수로 전달받은 값을 문자열로 변환 후 해당 문자열의 마지막에 추가함
String 클래스의 concat() 메소드와 같은 결과지만 처리 속도가 훨씬 빠름
public class StringMethod {
public static void main(String[] args) {
StringBuffer buff = new StringBuffer("Java");
System.out.println("문자열 : " + buff);
System.out.println(buff.append(" programming"));
System.out.println("append() 메서드 호출 후 문자열 : " + buff);
}
}
<실행결과>
문자열 : Java
Java programming
append() 메서드 호출 후 문자열 : Java programming
2. capacity() 메소드
StringBuffer 인스턴스의 현재 버퍼 크기를 변환함
기본적으로 생성되는 여유 버퍼 크기인 16에 문자 개수 더한 총 값을 반환
StringBuffer str01 = new StringBuffer();
StringBuffer str02 = new StringBuffer("java");
System.out.println(str01.capacity());
System.out.println(str02.capacity());
<실행결과>
16
20
3. delete() 메소드
전달된 인덱스에 해당하는 부분 문자열을 해당 문자열에서 제거
deleteCharAt()메소드를 사용하면 특정 위치의 문자 한 개만을 제거할 수도 있음
StringBuffer temp = new StringBuffer("Java Oracle");
System.out.println("문자열 : " + temp);
System.out.println(temp.delete(4,8));
System.out.println(temp.deleteCharAt(1));
System.out.println("deleteCharAt() 메소드 호출 후 문자열 : " + temp);
<실행결과>
문자열 : Java Oracle
Javacle
Jvacle
deleteCharAt() 메소드 호출 후 문자열 : Jvacle
4. insert() 메소드
인수로 전달된 값을 문자로 변환 후 해당 문자열의 지정된 인덱스 위치에 추가
StringBuffer temp2 = new StringBuffer("Java Programming");
System.out.println("문자열 : " + temp2);
System.out.println(temp2.insert(4, "Script"));
System.out.println("insert() 메서드 호출 후 문자열 : " + temp2);
<실행결과>
문자열 : Java Programming
JavaScript Programming
insert() 메서드 호출 후 문자열 : JavaScript Programming
변수(variable)
타입이 데이터 종류
변수는 데이터의 저장공간을 의미
변수를 사용하는 이유?
- 메모리에 데이터의 저장 공간을 확보
- 다른 개발자와 협업 시 변수명을 붙여 소통
- 데이터를 재사용
변수명 짓기
- 영문자(대소문자), 숫자, _ 사용 가능
- 카멜 케이스(camelCase)를 사용 🐫
- 사용할 수 없는 변수명
- 숫자로 시작하는 변수명
- 자바에서 이미 사용 중인 예약어(reserved word)
상수(constant)
상수란? 프로그램에서 변하면 안되는 수
자바에서 final 예약어 사용해서 상수임을 알려줌
final double CALCULATOR_PI = 3.14;
상수명은 일반적으로 대문자에 언더바(_)를 넣어 구분 (SCREAMING_SNAKE_CASE)
상수를 사용하는 이유?
- 오타로 인한 에러를 방지
- 변경하면 안되는 값을 보존
- 데이터를 재사용
리터럴(literal)
리터럴이란? 프로그램에서 사용하는 모든 숫자, 문자, 논리값을 일컫는 말
변수나 상수에 넣어준 문자나 숫자를 리터럴, 혹은 리터럴 상수 라고 함
프로그램이 시작할 때 시스템에 같이 로딩되어 상수 풀(constant pool)에 놓임
타입 변환
boolean을 제외한 기본 타입 7개는 서로 타입을 변환 할 수 있음
자동 타입 변환
- 바이트 크기가 작은 타입에서 큰 타입으로 변환
- 덜 정밀한 타입에서 더 정밀한 타입으로 변환할 때
byte(1) -> short(2)/char(2) -> int(4) -> long(8) -> float(4) -> double(8)
수동 타입 변환
메모리가 더 큰 타입에서 작은 타입으로 변환 할 때는 자동으로 타입이 변환되지 않음
더 큰 데이터 타입을 작은 데이터 타입의 변수에 저장할 때 캐스팅(casting)함
캐스팅 연산자()를 사용, 괄호 안에 변환하고자 하는 타입 적어주면 됨
int intValue = 30;
byte byteValue = (byte)intValue;
타입을 변환하고자 하는 메모리 내에 담을 수 없는 숫자일 경우 전혀 다른 값이 나올 수 있음
산술 연산자
+ : 두 항을 더함
- : 앞의 항에서 뒤의 항을 뺌
* : 두 항을 곱함
/ : 앞의 항에서 뒤의 항을 나눈 몫을 구함
% : 앞의 항에서 뒤의 항을 나눈 나머지를 구함
비교 연산자
boolean을 제외한 나머지 기본 타입에 모두 사용 가능
대소 비교 연산자
>
<
>=
<=
등가 비교 연산자
== : 양쪽 항이 같으면 true, 다르면 false
!= : 양쪽 항이 다르면 true, 같으면 false
조건 연산자
조건식 ? 참일 때의 결과 : 거짓일 때의 결과;
연산자 우선순위
괄호/대괄호 > 부정/증감 연산자 > 곱셈/나눗셈 연산자 > 대소 비교 연산자 > AND 연산자 > OR 연산자 > 조건 연산자
> 대입/할당 연산자
콘솔 입출력(I/O)
콘솔 출력
System 클래스는 자바 표준 입출력 스트림
System.out.println() : 출력하고 줄바꿈
System.out.print()
System.out.printf() : 형식대로 출력하기
콘솔 입력
Scanner 클래스를 import 해와야함
import java.util.Scanner;
Scanner scanner = new Scanner(System.in);
String inputValue = scanner.nextLine();
System.out.println(inputValue);
입력한 값이 콘솔에 출력됨
그외 메소드
Math.abs(int/long/double/float) : 절대값 구하는 메소드
String.format( ) : 문자열 형식을 지정하는 메소드 (C언어의 printf 함수처럼 사용 가능)
- %s / %S : 문자열
- %b / %B : boolean
- %d : 정수형
- %f : float 형
- %% : 퍼센트(%) 출력
'TIL(Today I Learned)' 카테고리의 다른 글
5/9 (월) 자바 배열 / 계산기 만들기 (0) | 2022.05.09 |
---|---|
5/6 (금) 자바 제어문 (0) | 2022.05.07 |
5/3 (화) Git 기초 (0) | 2022.05.04 |
5/2 (월) Linux 기초2 (0) | 2022.05.03 |
5/2 (월) Linux 기초 (0) | 2022.05.02 |