변수 개념
- 변수: 데이터를 저장하는 메모리 공간에 붙여준 이름
선언(Declaration): 변수를 컴파일러에게 알려주는 것
초기화(Initialization): 변수를 사용하기 위해 공간에 특정 값으로 할당해주는 것
public class SimpleClass {
// 변수 선언 및 초기화
int number = 10; // 정수형 변수
double decimalNumber = 5.5; // 실수형 변수
char character = 'A'; // 문자형 변수
boolean flag = true; // 불리언형 변수
String text = "Hello"; // 문자열형 변수
// 메인 메서드
public static void main(String[] args) {
// 클래스의 인스턴스 생성
SimpleClass example = new SimpleClass();
// 변수 값 출력
System.out.println("Integer: " + example.number);
System.out.println("Double: " + example.decimalNumber);
System.out.println("Char: " + example.character);
System.out.println("Boolean: " + example.flag);
System.out.println("String: " + example.text);
}
}
표기법
- 카멜 표기법(camelCase): 가장 앞 소문자, 나머지 단어의 첫 문자는 대문자
- 파스칼 표기법(PascalCase): 각 문자의 첫 문자를 대문자로 표기
JAVA 변수 명명 규칙
- 대소문자를 구분 (simple != Simple)
- 첫 번째 글자는 문자이거나 '$', '_' 이어야 함
- 숫자로 시작할 수 없음
- 카멜 케이스 명명 규칙을 따름
- 예약어(지정된 키워드)는 변수의 이름으로 사용할 수 없음
상수와 리터럴
상수
- 한 번 선언과 초기화를 하면 재정의할 수 없는 값
리터럴
- 어떤 변수에 선언되는 값, 즉 데이터 그 자체
입력과 출력
입력
- 실행 시 Argument로 넘겨 받는 방법
- 실행 시 키보드로 입력
출력
- java에서 기본적으로 제공해주는 print 메서드 사용
print(), println(), printf()
자료형(Data Type)
- 변수의 종류, 단위: 숫자(Number), 부울(Boolean), 문자(Character), 문자열(String), ...
- 변수의 종류에 따라 담을 수 있는 데이터의 타입과 크기가 다르다.
숫자
- 숫자 형태의 자료형(정수/실수/2진수, 8진수, 16진수)
- 정수: int, long, byte, short
소수를 포함하지 않음
주로 int형을 사용하며, 이진 데이터를 다룰 땐 byte를 많이 사용
- 실수: float, double
소수를 포함한 데이터 타입
실수형은 정수형과 저장방식이 다르기 때문에 같은 크기라도 큰 값을 표현 가능(데이터 표현 범위를 크게 하여 정밀도를 높임)
- 2진수, 8진수, 16진수
10진수: 0~9
2진수: 0, 1 (int 자료형을 2진수로 사용하려면 0b를 앞에 붙임)
8진수: 0~7 (int 자료형을 8진수로 사용하려면 0 앞에 붙임)
16진수: 0~9, A~F (int 자료형을 16진수로 사용하려면 0x를 앞에 붙임)
//상수 참조하기
/*
Integer.MAX_VALUE+1을 출력하면 max데이터를 넘어가 다시 음수가 나온다.
따라서 Long type을 사용해야 잘못 출력되지 않는다.
(long)Integer.MAX_VALUE
*/
MAX_VALUE
MIN_VALUE
//Integer class의 메서드 사용하기
Integer.toBinaryString() //2진수 변환
Integer.toOctalString() //8진수 변환
Integer.toHexString() //16진수 변환
부울
- 참과 거짓을 나타내는 자료 (true/false)
- 조건식과 논리식 계산에 사용
- boolean
- true, false 두 값만 표현하면 되기에 1바이트로 가능
문자
- 한 개의 문자 표현에 사용되는 자료형
- int형으로 변환하면 아스키 코드 값으로 변환되어 출력된다.
- char
- java에서 유니코드(2byte) 문자 체계를 사용
문자열(String)
- 문자들로 이루어진 집합
- 문자열 메소드: equals, indexOf, replace, substring, toUpperCase ...
'==' 는 객체 비교이고, equals는 값 비교이다. 따라서 new String 으로 객체를 생성하고 '==' 를 사용해 비교하면 false가 나온다. equals로 비교해야 원하는 값을 얻을 수 있다.
substring은 기존 문자열에서 부분 문자열을 뽑는 메서드이다.
// indexOf와 substring 혼용해보기
s.substring(0, s.indexOf("!")+1);
//첫 글자부터 느낌표까지 출력된다.
StringBuffer
- 문자열을 자주 추가하거나 변경할 때 사용하는 자료형
- 문자열 연결, 삽입, 삭제 등의 연산을 할 때 StringBuffer를 사용하면 효율적이다. String 객체는 불변(immutable)이기 때문에 문자열을 수정할 때마다 새로운 String 객체가 생성되는데, StringBuffer는 이러한 문제를 해결해 준다.
- stringBuffer 메소드: append, insert, substring ...
public class StringBufferExample {
public static void main(String[] args) {
StringBuffer buffer = new StringBuffer("Hello");
// 문자열에 문자열 추가
buffer.append(" World");
// 특정 인덱스에 문자열 삽입
buffer.insert(5, ",");
// 특정 인덱스의 문자 삭제
buffer.deleteCharAt(5);
// 문자열의 일부를 다른 문자열로 대체
buffer.replace(0, 5, "Hi");
System.out.println(buffer.toString()); // 출력: Hi World
}
}
배열
- 많은 수의 데이터를 담을 수 있는 자료
- index와 element로 구성됨
< 배열의 활용 >
- enhanched for 문 (for-each 문)
요소의 값을 변경하기에는 적합하지 않음
public class EnhancedForExample {
public static void main(String[] args) {
// 1차원 정수형 배열 선언 및 초기화
int[] numbers = {1, 2, 3, 4, 5};
// enhanced for문을 사용하여 배열의 각 요소 출력
for (int number : numbers) {
System.out.println(number);
}
}
}
- 배열의 복사
int[] original = {1, 2, 3, 4, 5};
int[] copy = new int[original.length];
System.arraycopy(original, 0, copy, 0, original.length);
int[] original = {1, 2, 3, 4, 5};
int[] copy = original.clone();
int[] original = {1, 2, 3, 4, 5};
int[] copy = Arrays.copyOfRange(original, 1, 4); // 2, 3, 4 복사
리스트
- 배열과 같이 여러 데이터를 담을 수 있는 자료형
- 추가로 여러가지 메소드를 제공
- 리스트 메소드: add, get, size, remove, clear, sort, contains, ...
- ArrayList list = new ArrayList();
import java.util.ArrayList;
public class ArrayListExample {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
// ArrayList에 요소 추가
list.add("Apple");
list.add("Banana");
list.add("Cherry");
//ArrayList 특정 인덱스에 요소 추가
list.add(3, "Orange");
// ArrayList에서 요소 얻기
System.out.println(list.get(1)); // 출력: Banana
// ArrayList에 있는 요소의 개수 얻기
System.out.println(list.size()); // 출력: 4
// ArrayList에서 요소 삭제
list.remove(1);
//list.remove("Banana");
// ArrayList가 특정 요소를 포함하고 있는지 확인
if (list.contains("Banana")) {
System.out.println("Banana is in the list");
} else {
System.out.println("Banana is not in the list"); // 출력: Banana is not in the list
}
// ArrayList의 모든 요소 출력
for (String fruit : list) {
System.out.println(fruit);
}
// 출력:
// Apple
// Cherry
// Orange
//오름차순 정렬
list.sort(Comparator.naturalOrder());
//내림차순 정렬
list.sort(Comparator.reverseOrder());
list.clear();
}
}
맵
- key, value 형태로 데이터를 저장하는 자료형
- 맵 메소드: put, get, size, remove, containsKey, ...
- HashMap<String, String> hashMap = new HashMap<String, String>();
- python의 dictionary와 비슷한 형태이다.
import java.util.HashMap;
public class HashMapExample {
public static void main(String[] args) {
HashMap<String, Integer> map = new HashMap<>();
// HashMap에 키와 값 쌍 추가
map.put("Alice", 25);
map.put("Bob", 30);
map.put("Charlie", 35);
// HashMap에서 키로 값을 얻기
System.out.println(map.get("Alice")); // 출력: 25
// HashMap에 있는 키-값 쌍의 개수 얻기
System.out.println(map.size()); // 출력: 3
// HashMap에서 특정 키-값 쌍 삭제
map.remove("Bob");
// HashMap에 특정 키가 있는지 확인
if (map.containsKey("Bob")) {
System.out.println("Bob is in the map");
} else {
System.out.println("Bob is not in the map"); // 출력: Bob is not in the map
}
// HashMap의 모든 키-값 쌍 출력
for (String key : map.keySet()) {
System.out.println(key + ": " + map.get(key));
}
// 출력:
// Alice: 25
// Charlie: 35
}
}
제네릭스
- 자료형을 명시적으로 지정
- 제한적일 수 있지만 안정성을 높여주고 형변환을 줄여준다.
- ArrayList<String> list = new ArrayList<String>();
타입 변환
- 서로 다른 타입 간의 연산을 수행하는 경우, 연산 수행 전 두 타입을 일치시켜야 하는데 변수나 리터럴의 타입을 변환하는 작업을 타입 변환 혹은 형 변환이라고 함
- 문자열(String) 타입도 기본 타입으로 변경 가능
자동 형 변환
- 경우에 따라 소스 코드상에서 형 변환을 안해도 컴파일러가 형 변환을 추가해주는 경우가 있음(자동 형 변환)
- 표현 범위가 좁은 범위에서 넓은 범위로 저장될 때, 자동 형 변환이 됨
byte < short < int < long < float < double
- 표현 범위가 넓은 범위에서 좁은 범위로 저장될 땐, 에러를 발생시킴
더 작은 범위로 할당되면서 값 손실이 일어날 수 있기 때문
명시적으로 형 변환을 해줄 시, 에러를 발생시키지 않음