본문 바로가기
Java

Java 내가 보려고 작성한 기본 기초 문법, 용어 정리

by haheehee 2022. 12. 5.

정수타입

  • byte : 1byte : -128 ~ +127
  • short : 2byte : -2^15 ~ ((2^15)-1)
  • char : 2byte : 0 ~ 65535(유니코드)​
  • int : 4byte : -2^31 ~ ((2^31)-1)​
  • long : 8byte : -2^63 ~ ((2^63)-1)​

실수타입

  • float : 4byte (소수점 7자리 이하) 뒤에 f 붙이기
  • double : 8byte (소수점 15자리 이하) 기본형

논리타입

  • boolean : true or false (기본 : false)

 


자동타입변환(Promotion)

 

큰type = 작은type

byte < short < int < long < float < double


리터럴(Literal)

 

소스코드에서 프로그래머에 의해 직접 입력된 값

정수로 인식


강제타입변환(Casting)

 

구현클래스 변수 = (구현클래스) 인터페이스변수;

작은type = (작은type) 큰type;


인스턴스 

클래스로부터 만들어진 객체 (만들어져서 현재 사용하고 있는 객체)

객체는 클래스의 인스턴스

인스턴스 멤버

객체마다 가지고 있는 멤버 : 인스턴스 필드, 인스턴스 메소드

객체를 생성한 후에 사용할 수 있는 필드와 메소드


​클래스 

 

클래스 변수 = new 클래스(); // 선언하면서 값 대입

-라이브러리 클래스(main메서드 없음)

-활용(실행) 클래스 (main 메서드)


클래스 멤버

 

클래스에 선언되는 것.

1. 필드 2. 생성자 3. 메소드


객체(Object) 

클래스로부터 생성되며 'new 클래스()'로 생성

클래스의 최고 조상

속성(필드) + 동작(메소드)로 구성


정적 (static) 멤버 

 

클래스에 고정된 멤버로서 객체 생성하지 않고 사용할 수 있는 필드와 메소드

-> 정적 메소드는 내부에 인스턴스 필드 및 메소드 사용할 수 없음. this도 사용불가

(사용하고 싶으면 객체 우선 생성 후 참조변수로 접근해야한다.)

인스턴스 멤버와 정적 멤버 선택 기준

객체마다 다를 수 있는 필드값 -> 인스턴스 필드로 선언

객체마다 다를 필요가 없는 필드값 -> 정적 필드로 선언

& 메소드 블록에 인스턴스 필드/인스턴스 메소드를 사용하면 인스턴스 메소드로 선언

사용하지 않으면 정적 메소드로 선언 => 혼공자바 1 p.68


필드(field)

 

필드(field)란 클래스를 구성하는 요소 중 하나로 클래스 내부 멤버이다

필드의 경우 다른 지역변수들과 다르게 초기화를 하지 않아도 기본값이 자동으로 초기화 된다.

객체의 고유 데이터, 부품 객체, 상태 정보를 저장 (변수와 다름)


this

 

(현재 만들어지고 있는) 객체 내에서 인스턴스 멤버에 접근하기 위해 사용

생성자와 메소드의 매개 변수 이름이 필드와 동일할 경우, 필드임을 지정하기 위해 주로 사용

Car(String model) {
	this.model = model;
}

생성자

 

constructor : 클래스로부터 new연산자로 객체를 생성할 때 호출되어 객체의 초기화를 담당


생성자 오버로딩(overloading)

 

매개 변수를 달리하는 생성자 여러 개 선언

외부에서 제공되는 다양한 데이터를 사용하여 객체화하기 위해


메소드 오버로딩(overloading)

 

같은 이름의 메서드를 여러 개 선언

매개값을 다양하게 받아 처리할 수 있도록 하기 위함


싱글톤(singleton)

 

전체 프로그램에서 단 하나의 객체만 만들도록 보장하는 코딩 기법

클래스 외부에서 사용 불가하도록 private 접근 제한자 사용

외부에서 호출할 수 있는 getInstance() 선언


Getter와 Setter 메소드

 

외부에서 객체에 마음대로 접근할 경우 객체의 무결성이 깨질 수 있음

게터세터는 필드이용!!!!!(보안 때문에 private으로 필드 선언한 후에 받아서 사용)

Setter ->매개변수로 받아

외부의 값을 받아 필드의 값을 변경하는 것이 목적

Getter ->리턴해

외부로 필드값을 전달하는 것이 목적 (가공해서 전달도 가능)​



상속

 

클래스는 하나의 부모로부터만 상속 가능

클래스 상속 : extends

자식객체 생성할 때 부모 객체가 먼저 생성되고 자식 객체 생성됨​


 

 

메소드 오버라이딩(재정의, Overriding)

 

부모 클래스의 모든 필드, 메소드를 가져와 사용

메소드 재정의 방법 : 부모 메소드와 동일한 시그니처(동일한 선언, 실행문만 변경 가능)

super : 상위 생성자 호출.. (super.메소드 : 상위 메소드 호출)

 

// (상수) static 이라 클래스명._____로 호출한것! => SUPERSONIC과 NORMAL

final 클래스는 : 수정될 수 없으므로 부모클래스가 될 수 없다./ final 메소드의 재정의도 불가능하다.


다형성

 

다양한 객체를 활용해 여러 실행결과가 나오도록 하는 성질

메소드 재정의와 타입 변환으로 구현​

1. 필드의 다형성 (혼공자바2 p.26)

필드 타입을 부모 타입으로 선언 : 다양한 자식 객체가 저장되어 필드 사용결과 달라질 수 있음

2. 매개변수의 다형성 (혼공자바2 p.30)

​매개변수를 부모 타입으로 선언 : 메소드 호출 시 매개값으로 부모 객체 및 모든 자식 객체를 제공할 수 있음

/ 자식의 재정의된 메소드가 호출 -> 다형성


강제타입변환(Casting)

 

자식type 변수 = (자식type) 부모type; // 부모타입을 자식 타입으로 변환

자식타입이 부모타입으로 자동 타입변환한 후 다시 반대로​


instance of​

 

어떤 객체가 어느 클래스의 인스턴스인지 확인

메소드 내 강제 타입 변환이 필요한 경우

(검사하고싶은 객체형) instanceof (이클래스냐?클래스형) => boolean형으로 결과 도출

// 클래스

​// 인터페이스


​추상클래스

 

메소드의 처리구문이 없는 것

직접 객체를 생성할 수 없지만 자식 객체가 생성될 때 객체화됨

추상메소드

메소드 선언만 통일하고 실행 내용은 클래스마다 다 달라야하는 경우.

중괄호 없이 메소드를 생성(abstract 키워드 사용)

하위 클래스에서 반드시 재정의를 하여 실행 내용을 채워야 한다.


​인터페이스

 

객체의 사용 방법을 정의한 타입

다형성

인터페이스의 메소드를 호출하면 객체의 메소드가 호출됨

인터페이스는 객체로 생성할 수 없으므로 생성자를 가질 수 없다

상수 필드만 선언 가능(인스턴스 혹은 정적 필드 선언 불가능)

=> [public static final] 타입 상수이름 = 값;

public int MAX_VOLUME = 10;

인터페이스 내의 메소드 : 실행블록 필요없는 추상 메소드로 선언(중문x)

구현 클래스 : 인터페이스에서 정의된 추상 메소드를 재정의해 실행내용을 가지고 있는 클래스

implements 키워드 사용

필드, 매개변수, 로컬변수로 선언 가능, 구현 객체를 대입

다형성 인터페이스 변수 = 구현객체; (자동타입변환, Vehicle vehicle = bus;)

구현클래스 변수 = (구현클래스) 인터페이스변수; (강제타입변환, Bus bus = (Bus) vehicle;



중첩(nested)

 

중첩된 클래스가 인스턴스 멤버 클래스

중첩 클래스에 static키워드 없으면 인스턴스필드와 메소드만 선언 가능

메소드 안에 중첩도 가능!

class A { class B {...} } 라면 => A a = new A();

A.B b = a.new B();

중첩된 클래스가 정적 멤버 클래스

static키워드와 함께 중첩 클래스가 선언되면 모든 종류의 필드와 메소드 선언 가능

(하지만 중첩 static클래스 안 인스턴스 필드와 메소드는 객체를 생성해야함, 외부 클래스는 객체생성 필요x)

​​ class A { static class B {...} } 라면 => A.C c = new A.C();

중첩 인터페이스는 (무조건)되도록 static!!!

클래스의 멤버로 선언된 인터페이스는, 해당 클래스와 긴밀한 관계를 맺는 구현 클래스를 만들기 위해 static사용



익명객체 anonymous

 

클래스 이름이 없는 객체

어떤 클래스를 상속하거나 인터페이스를 구현해야 함

  • 일반적인 경우 부모 타입의 필드나 변수 선언하고 자식 객체를 초기값으로 대입하는 경우

부모 클래스 상속하여 자식 클래스 선언

new연산자 이용하여 자식 객체 생성 후 부모 타입의 필드나 변수에 대입

  • 자식 클래스를 재사용하지 않고 특정 위치에서만 사용하려는 경우

익명 자식 객체 생성하여 사용 (제일 마지막 }; 주의)

필드 선언할 때 초기값으로 익명 자식 객체 생성하여 대입 (제일 마지막 }; 주의)

메소드 내에서 로컬 변수 선언 시 초기값으로 익명 자식 객체 생성하여 대입 (제일 마지막 }; 주의)

메소드 매개 변수가 부모 타입일 경우 메소드 호출하는 코드에서 익명 자식 객체 생성하여 매개값으로 대입

(제일 마지막 ); 주의)

  • 익명 자식 객체에 새롭게 정의된 필드 및 메소드는 익명 자식 객체 내부에서만 사용되고 외부에서는 접근할 수 없음

인터페이스 타입의 필드/ 변수 선언 후 구현 객체를 초기값으로 대입하는 경우

  • 필드 선언 시 초기값으로 익명 구현 객체 생성하여 대입하는 경우
  • 메소드 내에서 로컬 변수 선언 시 초기값으로 익명 구현 객체 생성하여 대입
  • 메소드의 매개 변수가 인터페이스 타입일 때 메소드 호출하는 코드에서 익명 구현 객체 생성하여 매개값으로 대입하는 경우
익명객체 (익명 클래스) anonymous
          (참고한 블로그1 : 
https://limkydev.tistory.com/226 )
          (참고한 블로그2 : https://blog.naver.com/j931018/221142327190 )

이름이 없다! -> 기억되지 않아도 된다! -> 나중에 다시 불러질 이유가 없다 => 프로그램에서 일시적으로 한번만 사용되고 버려지는 객체 (일시적으로 사용, 재사용되지 않음)

클래스를 별도로 만들 필요 없이 코드에서 익명객체를 생성/정의하여 단 한번 쓰고 소멸

구현방법 2가지
  1. 부모/자식간 상속 아래 익명 자식객체 생성
  2. 인터페이스를 구현한 익명 구현 객체를 생성
  1. 부모/자식간 상속 아래 익명 자식객체 생성

필드의 초기값 / 로컬변수의 초기값 / 매개변수의 매개값

부모클래스 [필드|변수] = new 부모클래스(매개값, ... ) { };

2. 인터페이스를 구현한 익명 구현 객체를 생성

인터페이스는 강제적으로 무조건 정의를 통해 사용해야하는 메서드가 있기 때문에,-> 규격화에 도움



 예외

 

- instanceof 연산자

- try-catch-finally

- throws 키워드

메소드 선언부 끝에 작성되어 메소드에서 처리하지 않은 예외를 호출한 곳으로 넘기는 역할



Hashcode (Object 클래스)

 

객체를 식별하는 정수값

사용하는 이유 중에 하나는, 객체를 비교할 때 드는 비용을 낮추기 위해서

-> Hashcode를 이용하면 시간이 단축된다. // 주소를 획일화하기 위함

객체 메모리 번지를 이용하여 해시코드를 만들어 리턴 // 객체마다 다른 값을 가지며, 두 객체가 동등한지 비교가 필요

그리고 hashcode가 같을 때는 equals()로 두 객체가 같은지 비교할 수 있습니다.

(equals() : 두 객체의 내용이 같은지 확인하는 Method)

(hashCode() : 두 객체가 같은 객체인지 확인하는 Method)

HashMap<Key, String> hashMap = new HashMap<Key, String>(); // Key:식별키=> HashMap객체 생성 
hashMap.put(new Key(1), "홍길동"); // 식별키 new Key(1)로 "홍길동" 저장 
String value = hashMap.get(new Key(1)); // 식별키 new Key(1)로 "홍길동" 읽기
// 클래스 Member에 들어있는 equals 오버라이딩 메소드 
@Override public boolean equals(Object obj) { 
	if(obj instanceof Member) { 
    	Member member = (Member) obj; 
        if(id.equals(member.id)) { 
        	return true; 
        } 
     }
     return false; 
} 
// 재정의한 hashCode()메소드 Key클래스에 추가하여 의도한대로 읽게하기 
@Override public int hashCode() { return id.number; }
​

toString( ) (Object 클래스)

객체 문자 정보

@Override 
public String toString() { 
	return 재정의할 것; 
} 

메인문에서 String strObj = myPhone.toString(); System.out.println(strObj); 
// 재정의한 toString() 리턴문


exit( ) (System 클래스)

 

프로그램 종료

JVM 강제 종료

System.exit(0); // 0을 종료 상태값이라 함
 

currentTimeMillis( ), nanoTime( ) (System 클래스)

 

현재 시각 읽기 (단위 long 값 리턴)

System.currentTimeMillis(); 
System.nanoTime(); 
long time2 = System.nanoTime();


getClass( ), forName( ) (Class 클래스)

 

Class 객체 얻기

자바는 클래스와 인터페이스의 메타 데이터를 Class 클래스로 관리

// 클래스로부터 얻는 방법1 
Class clazz = 클래스이름.class; 

// 클래스로부터 얻는 방법2 
Class clazz = Class.forName("패키지...클리스이름"); 

// 객체로부터 얻는 방법 
Class clazz = 참조변수.getClass();


String 생성자 (String 클래스)

 

직접 String 객체를 생성

// 배열 전체를 String 객체로 생성 
String str = new String(byte[] bytes); 
// 지정한 문제셋으로 디코딩 
String str = new String(byte[] bytes, String charsetName); 
// 배열의 offset 인덱스 위치부터 length만큼 String 객체로 생성 
String str = new String(byte[] bytes, int offset, int length); 
// 지정한 문제셋으로 디코딩 
String str = new String(byte[] bytes, int offset, int length, String charsetName); 
// 배열로 받으면 length는 배열-2의 크기로 지정해줘야함(마지막에 null(\0)이 자동생성되니까

throws IOException

 

print(), println(), printf() 메서드만큼은 자체적으로 예외처리를 심어 놨기 때문이다.

반대로 말하면, 위의 3가지 메서드 이외의 입출력 메서드에는 모두 예외처리 문구를 삽입해줘야 한다는 것이다.


getBytes( ) (String 클래스) 인코딩 / 디코딩

 

시스템의 기본 문자셋으로 인코딩된 바이트 배열 리턴

getBytes(Charset charset) 메소드는 특정 문자셋으로 인코딩된 바이트 배열

String 문자열을 Byte 형태 배열로 인코딩 변환

           (참고 블로그 : https://blog.naver.com/ksr9505/222938916251)

utf-16이므로 한 문자당 2byte (보통은 utf-8의 형태로)

 

인코딩 : 들어갈 수 있도록 풀어지는 것

디코딩 : 객체형

byte[] bytes = "문자열".getBytes(); // 인코딩 
byte[] bytes = "문자열".getBytes(Charset charset); // 디코딩

indexOf( ) (String 클래스)

 

문자열 찾기

String subject = "자바 프로그래밍; 
int index = subject.indexOf("프로그래밍"); 
// 인덱스는 0부터 시작이므로 index에는 3이 저장

length( ) (String 클래스)

 

문자열의 길이를 리턴

String subject = "자바 프로그래밍"; 
int length = subject.length(); // 8

replace( ) (String 클래스)

 

문자열 대치

첫 번째 매개값인 문자열을 찾아 두 번째 매개값인 문자열로 대치한 새로운 문자열 생성 및 리턴

String oldStr = "자바 프로그래밍"; 
String newStr = oldStr.replace("자바", "JAVA"); // JAVA 프로그래밍

substring( ) (String 클래스)

 

문자열 잘라내기

주어진 인덱스에서 문자열 추출

String ssn = "97070-1234567"; String firstNum = ssn.substring(0, 6); 
// 인덱스 0~(6-1)의 문자열 추출 970701 

String secondNum = ssn.substring(7); 
// 인덱스 7부터 끝까지 문자열 추출 1234567

toLowerCase( ), toUpperCase( ) (String 클래스)

 

알파벳 소, 대문자 변경

객체생성후

객체.toLowerCase();

객체.toUpperCase();


trim( ) (String 클래스)

 

문자열 앞뒤 공백 잘라내기


valueOf( ) (String 클래스)

문자열 변환

String str1 = String.valueOf(10); 
String str2 = String.valueOf(10.5); 
String str3 = String.valueOf(true);


Wrapper(포장) 클래스

 

기본타입의 값을 내부에 두고 포장

외부에서 변경할 수 없음

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

Boxing과 Unboxing (Wrapper 포장 클래스)

박싱 : 기본 타입의 값을 포장객체로 만드는 과정

언박싱 ; 포장객체에서 기본 타입의 값을 얻어내는 과정

Integer obj1 = new Integer(100); // 박싱

int value1 = obj1.intValue(); // 언박싱

문자열을 기본 타입값으로 변환

  • parse+기본타입이름


Math 클래스

 

 

random( ) (Math 클래스)

문자열 변환

int num = (int)(Math.random( ) * 원하는랜덤최대값) +1;


Thread

 

Runnable을 매개값으로 갖는 생성자 호출

Thread thread = new Thread(Runnable target); // Runnable은 인터페이스

Runnable task = new Task(); Thread thread = new Thread(task);
// Runnable 익명 객체를 매개값으로 사용하여 Thread생성자를 호출할 수도 있음 
Thread thread = new Thread(new Runnable() { 
	public void run() { 
    	스레드가 실행할 코드; 
    } 
} ); 
thread.start(); // 스레드 실행


제네릭스

 

매개변수화된 자료형

매개변수에 다양한 자료형의 데이터를 넘길 수 있음

코드 재사용성 높여줌

void set(T x) { 
	System.out.println(x); 
} 
// 매개변수 T자리에는 자료형이 와야 한다. -> 어떤 자료형이던 T에 넣을 수 있음

클래스 객체 생성할 때는 < >기호를 사용

 

클래스명<매개변수 타입 리스트> { ... } 클래스명<타입> 객체명 = new 클래스명<타입>();


컬렉션 프레임워크

 

프레임워크 : 사용방법을 정해놓은 라이브러리

List, Set, Map

  • List 컬렉션

객체를 인덱스로 관리

객체 자체를 저장하는 것이 아니고 객체 번지를 참조하는것. (null도 저장 가능)

ArrayList : List인터페이스의 대표적 구현 클래스(선형 리스트)/ 인덱스 이용

  • Set

객체를 인덱스

  • Map

객체를 인덱스

 

 

 

 

 

 

 

 

 

 

출처 : 혼자 공부하는 자바 (신용권)

'Java' 카테고리의 다른 글

자바 #005_참조  (0) 2022.12.12
자바 #004_조건문, 반복문  (0) 2022.12.12
자바 #003_연산자  (0) 2022.12.12
자바 #002_변수, 리터럴  (0) 2022.12.08
자바 #001_자바 시작하기  (0) 2022.12.06

댓글