boolean, byte, short, int, long, char, double, float
기본 자료형을 class로 생성한 것
기본 자료형 | byte 수 | Wrapper Class |
---|---|---|
boolean | 1byte = 8bit | Boolean |
char | 2byte = 16bit | Character |
byte | 1byte = 8bit | Byte |
short | 2byte = 16bit | Short |
int | 4byte = 32bit | Integer |
long | 8byte = 64bit | Long |
float | 4byte = 32bit | Float |
double | 8byte = 64bit | Double |
기본 자료형 외
코드 | 진법 변환 |
---|---|
Integer.toBinaryString(data) | 10진수 → 2진수 |
Integer.toOctalString(data) | 10진수 → 8진수 |
Integer.toHexString(data) | 10진수 → 16진수 |
Integer.parseInt(data, 2) | 2진수 → 10진수 |
Integer.parseInt(data, 8) | 8진수 → 10진수 |
Integer.parseInt(data, 16) | 16진수 → 10진수 |
Stack | Heap |
---|---|
강제초기화 X | 강제초기화 O |
빈 값 가능 | 빈 값 불가능 기본 초기값이 강제 설정 (자료형에 따라 설정) |
기본/참조 | 자료형 | 기본값 |
---|---|---|
기본 | boolean | false |
기본 | 정수 (byte, short, int, long) | 0 |
기본 | 실수(float, double) | 0.0 |
참조 | 클래스, 배열 등 | null |
== : 비교 연산자. Stack 메모리의 값을 비교
int a1 = 7;
int a1 = 7;
System.out.println(a1 == a2); # true
String b1 = new String("안녕");
String b2 = new String("안녕");
System.out.println(b1 == b2); # false
# a1과 a2는 stack 메모리에 각각의 변수와 값을 저장하지만 값이 동일하기에 true
# b1과 b2는 stack 메모리에 각각의 변수를 저장하고 실질적인 값("안녕")은 heap 메모리에 저장함. stack 메모리에 저장된 변수에는 실질적인 값의 위치값을 저장하기 때문에 b1과 b2는 가지고 있는 위치값이 다르기 때문에 false
int a = 3; # int = int
String b = "가"; # String = String
# = (등호)를 중심으로 선언부(왼쪽)와 구현부(오른쪽)의 타입은 무조건 동일하여야 함
for 실행순서
while 실행순서
do-while 실행순서
break : if문을 제외한 가장 가까운 중괄호({})를 탈출시킴
continue : if 문을 제외한 가장 가까운 중괄호({})를 대신하여 탈출시킴
라벨(label) : colon(:)과 함께 사용하여 사용 위치로 이동하도록 안내함
메모리는 데이터를 1차원으로만 저장 가능
2차원 데이터를 저장하기 위해서는 1차원(배열의 경우 행 단위)으로 나누어 저장
int[][] a = new int[][] {{1, 2, 3}, {4, 5, 6}};
String str = new String("안녕");
# String : 클래스
# str : 참조변수
# new : Heap 메모리에 할당하라
# String() : 생성자
-> 생성자의 출력값<()>이 객체
다중 상속 불가능
class A {
int a = 3;
}
class B {
int a = 5;
}
class C extends A, B {}
# A, B 동시 다중 상속이 불가능. 만약 A, B 모두 다중 상속 받을시 동일한 이름의 2개 a 변수 중 어느 3, 5 중 어느 값을 사용하여야할지 결정하지 못함
클래스의 인스턴스. 객체를 인스턴스(instance)라고도 칭함
인스턴스 멤버 (= 내부)에는 필드, 메소드, 이너클래스가 존재 가능
클래스 상속시 부모 클래스의 멤버 중 필드, 메소드, 이너클래스를 받아옴 (생성자는 제외)
클래스 상속시 메모리 구조
class A {
int m;
void abc() {}
}
class B extends A {
int n;
void bcd() {}
}
public class Main {
public static void main(String[] args) {
B b = new B();
}
}
생성자 주요역할 : 객체 생성, 필드 초기화
모든 클래스는 생성자를 필수 포함
class A {
int m;
void work() {
}
A () {} # 기본 생성자 (입력 매개변수가 없는 생성자)
}
접근지정자
사용 | 지정자 | 동일 패키지 | 다른 패키지 |
---|---|---|---|
클래스 멤버, 생성자 | public | 모든 클래스 사용 가능 | 모든 클래스 사용 가능 |
멤버, 생성자 | protected | 모든 클래스 사용 가능 | 자식 클래스에서만 사용 가능 |
클래스 멤버, 생성자 | default | 모든 클래스 사용 가능 | 사용불가 |
멤버, 생성자 | private | 동일 클래스에서만 사용 가능 | 사용불가 |
String str1 = new String("안녕");
String str2 = str1; # str1의 값이 아닌 주소값을 복사하여 같은 위치의 값을 출력
str1 = "안녕하세요";
String str1 = new String("안녕");
String str2 = "안녕"; # 리터럴로 바로 입력하여 str3과 객체 공유
String str3 = "안녕"; # 리터럴로 바로 입력하여 str2와 객체 공유
String str4 = new String("안녕");
String str1 = new String("안녕");
String str2 = new String("안녕");
System.out.println(str1.equals(str2)); # true
System.out.println(str1.equalsignore(str2)); # true
# equals : 문자열의 값을 비교 (주소값 비교 X, 대소문자 구분 O)
# equalsignore : 문자열의 값을 비교 (주소값 비교 X, 대소문자 구분 X)
구분 | 리턴 타입 | 메소드 | 설명 |
---|---|---|---|
문자열 길이 | int | length() | 문자열의 길이 |
문자열 검색 | char | charAt(int index) | 인덱스 위치에서의 문자 |
문자열 검색 | int | indexOf(int ch) indexOf(int ch, int fromIndex) indexOf(String str) indexOf(String str, int fromIndex) | 문자열에 포함된 문자 또는 문자열의 위치를 앞에서부터 검색했을 때 일치하는 인덱스 값 (fromIndex는 검색 시작 위치) |
문자열 검색 | int | lastIndexOf(int ch) lastIndexOf(int ch, int fromIndex) lastIndexOf(String str) lastIndexOf(String str, int fromIndex) | 문자열에 포함된 문자 또는 문자열의 위치를 뒤에서부터 검색했을 때 일치하는 인덱스값 (fromIndex는 검색 시작 위치) |
문자열 변환 및 검색 | float | String.valueOf(boolean b) String.valueOf(char c) String.valueOf(int i) String.valueOf(long l) String.valueOf(float f) String.valueOf(double d) | boolean, char, int, long, float, double 값을 문자열로 변환하기 위한 정적 메소드 |
문자열 변환 및 검색 | double | concat(String str) | 문자열 연결 (String 객체의 + 연산과 동일) |
문자열 배열 변환 | byte[] | getBytes() getBytes(Charset charset) | 문자열을 byte[]로 변환 (변환할 때 문자 셋(charset) 지정 가능) |
문자열 배열 변환 | char[] | toCharArray() | 문자열을 char[]로 변환 |
문자열 수정 | String | split(String regex) split(String regex, int limit) | regex를 기준으로 문자열을 분할하며 분할한 문자열 배열을 생성(regex 구분기호는 '|' 기호로 여러 개 사용 가능) limit은 분할의 최대 개수 |
문자열 재정의 | String | toString() | Object 객체의 정보 패키지.클래스명@해쉬코드 일반적으로 오버라이딩해서 사용 |
메모리값 비교 | boolean | equals(Object obj) | 매개변수 Obj 객체와 stack 메모리 값(번지) 비교 즉, 비교연산자 ==와 동일한 결과 메모리 값이 아닌 객체의 값을 비교하기 위해서는 Override를 통해 재정의 필요 |
해쉬코드 | int | hashCode() | 객체의 hashCode() 값 리턴. hashMap, hashTable 등의 동등비교에 사용. 위치값을 기반으로 생성된 고유값 |
다중 상속 불가능
abstract class A {
abstract void abc() {
System.out.println("추상메소드");
}
}
다중 상속 가능
interface A {
public static final int a = 5;
public abstract void abc();
}
interface B {
int a = 5; # public static final을 작성하지 않아도 컴파일러가 자동으로 추가
void abc(); # public abstract를 작성하지 않아도 컴파일러가 자동으로 추가
}
class C implements A, B {}
# A, B의 a 필드에 static 키워드가 작성되기 때문에 A.a, B.b 각각 다른 값으로 할당되어 다중 상속이 가능
클래스와 인터페이스를 동시에 상속 가능. 구문 순서는 extends → implements 순으로 작성
참고! 클래스는 다중 상속 불가능, 인터페이스는 다중 상속 가능
class A {}
interface B {}
interface C {}
class D extends A implements B, C {}
# 무조건 extends(클래스) → implements(인터페이스) 순으로 구문 작성. 작성 순서 변경 불가능
class A {}
class B extends A {} # 클래스 ← 클래스 상속시 extends
interface A {}
class B implements A {} # 클래스 ← 인터페이스 상속시 implements
interface A {}
interface B extends A {} # 인터페이스 ← 인터페이스 상속시 extends
# 주의! 인터페이스 ← 클래스 상속은 불가능. 클래스는 이미 완성된 타입이기 때문에 미완성 타입인 인터페이스로 상속 불가능
객체의 stack 메모리 값(번지) 비교 (비교연산자 == 와 동일한 결과). 메모리 값이 아닌 객체의 값을 비교하기 위해서는 Override를 통해 재정의 필요
String, Integer 등 기본적으로 재정의되어 있음
class A {
String name;
A(String name) {
this.name = name;
}
@Override
public boolean equlas(Object obj) {
if (obj instanceof A) {
if (this.name == ((A)obj).name) {
return true;
}
return false;
}
return false;
}
}
}
: (colon) : 이정표 역할을 담당함. 조건에 부합하는 코드(위치)로 이동(점프)하도록 안내함. 삼항연산자, case, 라벨, 람다식에서 사용함
; (semi-colon) : 코드의 끝을 나타냄. 코드 끝에 작성하지 않으면 오류 발생함
. : 참조변수명 뒤에 있을 경우 참조 변수의 위치로 안내 (ex. example.length)
literal : 데이터(값) 자체. 변수에 할당한 변하지 않는 값을 의미
final int a = 1;
String b = new String("안녕");
# a의 1, b의 "안녕"이 리터럴