Java 키워드별 Tip

김병현·2022년 4월 4일
0

Java

목록 보기
2/4

자료형 종류

기본 자료형

boolean, byte, short, int, long, char, double, float

wrapper class

기본 자료형을 class로 생성한 것

기본 자료형byte 수Wrapper Class
boolean1byte = 8bitBoolean
char2byte = 16bitCharacter
byte1byte = 8bitByte
short2byte = 16bitShort
int4byte = 32bitInteger
long8byte = 64bitLong
float4byte = 32bitFloat
double8byte = 64bitDouble

참조 자료형

기본 자료형 외


진법 변환

코드진법 변환
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진수

기본 자료형과 참조 자료형 메모리 구조

StackHeap
강제초기화 X강제초기화 O
빈 값 가능빈 값 불가능
기본 초기값이 강제 설정
(자료형에 따라 설정)

기본/참조자료형기본값
기본booleanfalse
기본정수
(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

필수조건

  1. 선언부와 구현부의 타입은 무조건 동일하여야 함
int a = 3;	# int = int
String b = "가";	# String = String

# = (등호)를 중심으로 선언부(왼쪽)와 구현부(오른쪽)의 타입은 무조건 동일하여야 함

반복제어문

for 실행순서

while 실행순서

do-while 실행순서


제어키워드

break : if문을 제외한 가장 가까운 중괄호({})를 탈출시킴

continue : if 문을 제외한 가장 가까운 중괄호({})를 대신하여 탈출시킴

라벨(label) : colon(:)과 함께 사용하여 사용 위치로 이동하도록 안내함


배열 필수 조건

  1. 동일한 자료형만 묶어서 저장 가능
  2. 생성 또는 선언부와 구현부를 분리하여 작성시 방 크기를 한번 필수적으로 지정해야함 (지정 이후 방 크기 변경 불가)

2차원 배열 메모리 구조

메모리는 데이터를 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 중 어느 값을 사용하여야할지 결정하지 못함

클래스 외부에 올 수 있는 3가지

  1. package : .java 파일의 폴더(패키지) 위치
  2. import : 다른 폴더(패키지) 위치의 클래스 참조
  3. external class : 외부에 포함된 또 다른 클래스. public 키워드 사용 불가능

클래스 내부에 올 수 있는 4가지

  1. field(멤버) : 클래스 내부 ~ 메소드 외부에 위치한 클래스 특징(속성)을 나타내는 변수
  2. method(멤버) : 클래스의 기능. return 타입 + 메소드 이름 + () + {} 구성
  3. 생성자 : 객체 생성 기능. 생성자 이름은 클래스 이름과 동일해야함. 생성자 이름 + () + {} 구성
  4. inner class(멤버) : 클래스 내부에 정의된 클래스

객체 (Object)

클래스의 인스턴스. 객체를 인스턴스(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 () {}		# 기본 생성자 (입력 매개변수가 없는 생성자)
}

제어자 (modifier)

접근지정자

사용지정자동일 패키지다른 패키지
클래스
멤버, 생성자
public모든 클래스 사용 가능모든 클래스 사용 가능
멤버, 생성자protected모든 클래스 사용 가능자식 클래스에서만 사용 가능
클래스
멤버, 생성자
default모든 클래스 사용 가능사용불가
멤버, 생성자private동일 클래스에서만 사용 가능사용불가

String

  1. 객체내의 값 변경 불가능. 값 변경시 새로운 객체를 생성하여 작성
  2. 리터럴을 바로 입력한 값은 문자열이 같은 경우 하나의 객체를 공유
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)

String 클래스 주요 메소드

구분리턴 타입메소드설명
문자열 길이intlength()문자열의 길이
문자열 검색charcharAt(int index)인덱스 위치에서의 문자
문자열 검색intindexOf(int ch)
indexOf(int ch, int fromIndex)
indexOf(String str)
indexOf(String str, int fromIndex)
문자열에 포함된 문자 또는 문자열의 위치를
앞에서부터 검색했을 때 일치하는 인덱스 값
(fromIndex는 검색 시작 위치)
문자열 검색intlastIndexOf(int ch)
lastIndexOf(int ch, int fromIndex)
lastIndexOf(String str)
lastIndexOf(String str, int fromIndex)
문자열에 포함된 문자 또는 문자열의 위치를
뒤에서부터 검색했을 때 일치하는 인덱스값
(fromIndex는 검색 시작 위치)
문자열 변환 및 검색floatString.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 값을
문자열로 변환하기 위한 정적 메소드
문자열 변환 및 검색doubleconcat(String str)문자열 연결
(String 객체의 + 연산과 동일)
문자열 배열 변환byte[]getBytes()
getBytes(Charset charset)
문자열을 byte[]로 변환
(변환할 때 문자 셋(charset) 지정 가능)
문자열 배열 변환char[]toCharArray()문자열을 char[]로 변환
문자열 수정Stringsplit(String regex)
split(String regex, int limit)
regex를 기준으로 문자열을 분할하며 분할한 문자열
배열을 생성(regex 구분기호는 '|' 기호로 여러 개 사용 가능)
limit은 분할의 최대 개수
문자열 재정의StringtoString()Object 객체의 정보 패키지.클래스명@해쉬코드
일반적으로 오버라이딩해서 사용
메모리값 비교booleanequals(Object obj)매개변수 Obj 객체와 stack 메모리 값(번지) 비교
즉, 비교연산자 ==와 동일한 결과
메모리 값이 아닌 객체의 값을 비교하기 위해서는
Override를 통해 재정의 필요
해쉬코드inthashCode()객체의 hashCode() 값 리턴. hashMap, hashTable 등의
동등비교에 사용. 위치값을 기반으로 생성된 고유값

추상클래스

  1. 추상메소드명 앞에 abstract 키워드가 작성되어야함
  2. 클래스 내 추상메소드가 최소 하나 이상 포함되어 있을 시 클래스명 앞에도 무조건 abstract 키워드가 작성되어야 함
    다중 상속 불가능
abstract class A {
	abstract void abc() {
    	System.out.println("추상메소드");
    }
}

인터페이스

  1. 인터페이스 내 모든 필드가 public static final로 정의됨
  2. 인터페이스 내 모든 메소드가 public abstract로 정의됨
    다중 상속 가능
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

# 주의! 인터페이스 ← 클래스 상속은 불가능. 클래스는 이미 완성된 타입이기 때문에 미완성 타입인 인터페이스로 상속 불가능

Object

equlas (Object method)

객체의 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의 "안녕"이 리터럴
profile
Without haste, but without rest.

0개의 댓글