[Java] 1학기 기말고사 정리

최민재·2022년 6월 25일
2

기본 자료형의 표현범위, 접미사

  • 정수형 : byte, short, int, long, char
  • 소수형 : float, double
  • 기타 : boolean

타입별 숫자의 범위

접미사

자바는 수를 변수에 저장하기 전에 그 수를 메모리에 저장하는데,
저장하는 형태가 무조건 int형이다.
만약 1000000000000을 저장하려고 한다면 int형으로 나타낼 수 없고 컴파일 에러가 난다.

따라서 위와 같은 경우 아래와 같이 저장한다.

long a = 1000000000000L

위와 같은 경우처럼 Float형 또한 마찬가지로
소수를 저장할 때 기본적으로 Double형이다.

float a = 3.14F;

printf문 출력지시자

콘솔 사용자 입력

InputStream in = System.in;
InputStreamReader reader = new InputStreamReader(in);
BufferedReader br = new BufferedReader(reader);

Scanner sc = new Scanner(System.in);

위와 같은 방식을 입력을 받는다.

  • InputStream - byte
  • InputStreamReader - character
  • BufferedReader - String

자바의 연산자

대입 연산자 : =, +=, -=, *=, /=, %=
단항 연산자 : +, -, ++, --, !
산술연산자 : +, -, *, /, %

우선 순위
1. 단항 연산자
2. 산술 연산자 (*, /, %)
3. 산술 연산자 (+, -)

비교 연산자 : ==, !=, >, >=, <, <=
논리 연산자 : &&, ||

?: 연산자 -> 삼항 연산자

boolean isGood = false;
isGood = (point >= 80) ? true : false;

비트 연산자 : &, |, ^, ~, <<, >>, >>>
형 변환 연산자 : (타입)
문자열 더하기 연산자 : +

자바의 컴파일 과정

클래스와 객체, 메소드, 매개변수, return 타입, 이름 명명 작성 관례 등

클래스

클래스 이름은 명사이여야 하며, 복합 단어일 경우 각 단어의 첫 글자는 대문자이어야 한다.
클래스 이름은 간단하고 명시적으로 작성해야 한다.
완전한 단어를 사용하고 두 문자어와 약어는 피하도록 한다.

ex)

class Raster;
class ImageSprite;

메소드

메서드의 이름은 동사이어야 하며, 복합 단어일 경우 첫 단어는 소문자로 시작하고 그 이후에 나오는 단어의 첫 문자는 대문자로 사용해야 한다.
ex)

run();
runFast();
getBackground();

변수

변수 이름의 첫 번째 문자는 소문자로 시작하고, 각각의 내부 단어의 첫 번째 문자는 대문자로 시작해야 한다.
변수 이름이 언더바(_) 또는 달러 표시 문자로 시작하는 것이 허용되기는 하지만, 이 문자들로 시작하지 않도록 주의하자.

이름은 짧지만 의미 있어야 한다.
이름의 선택은 그 변수의 사용 의도를 알아낼 수 있도록 의미적이어야 한다.

ex)

float myWidth;

클래스의 기본 생성자, 생성자 작성 규칙, 객체의 생성 방법 등

기본 생성자란?

자바는 생성자를 만들지 않아도 자동으로 만들어지는 기본 생성자가 있다.
main() 메소드에서 클래스의 이름으로 객체를 생성한 것이 바로 기본 생성자다.
ex)

public class ReferenceDefault {
	public static void main(String[] args) {
    	ReferenceDefault reference = new ReferenceDefault();
    }
}

등호 우측에 new 옆에 있는 ReferenceDefault()라는 것이 바로 생성자.

아무런 매개 변수가 없는 ReferenceDefault()라는 생성자는 다른 생성자가 없을 경우 기본으로 컴파일할 때 만들어진다.

생성자 작성 규칙

선언부에 리턴 타입이 없고,
메소드 이름 대신 클래스 이름과 동일하게 이름을 지정하는 것뿐이다.

위치는 클래스의 다른 메소드들 보다 위에, 가장 윗부분에 선언하는 것이 좋다.

public class ReferenceString {
    String instanceVariable; -> 인스턴스 변수
    
    // -> 생성자 영역
    public ReferenceString() {}
    public ReferenceString(String arg) {}  
    // --------------
    
    // -> 메소드 영역
    public static void main(String args[]) {
    	ReferenceString reference = new ReferenceString();
    }
    
    public String getString() {
    	return instanceVariable;
    }
    public void setString() {
    	instanceVariable = str;
    }
    // --------------------
}

즉, 인스턴스 변수들을 선언한 후에 생성자를 위치시키고, 그 다음에 필요한 메소드들을 위치시켜야 누가 해당 소스 코드를 보더라도 생성자를 찾기 위한 시간을 허비하지 않을 것!

객체의 생성 방법

class 명에 new를 붙여서 생성할 수 있다.

class Hello {
   public static void main(String[] args) {
       Hello hello = new Hello();
   }
}

하나의 클래스에 여러 개의 생성자 생성 방법

자바는 클래스의 객체를 보다 간편하게 만들기 위해서 여러 가지 매개 변수를 갖는 여러 생성자를 가질 수 있다.
생성자의 개수는 1개여도 되고 100개가 되도 상관이 없다.

public class MemberDto() {
    public String name;
    public String phone;
    public String email;
    
    public MemberDto(String name) {
        this.name = name;
    }
    
    public MemberDto(String name, String phone) {
        this.name = name;
        this.phone = phone;
    }
    
    public MemberDto(String name, String phone, String email) {
        this.name = name;
        this.phone = phone;
        this.email = email;
    }
}

클래스 변수, 객체 변수, 지역 변수, 매개변수, final로 선언된 변수, static으로 선언된 변수

public class Test {
	int iv;	// 인스턴스 변수
    static int cv; // 클래스 변수
    
    void method() {
    	int lv;	// 지역 변수
    }
}

매개변수 : 함수의 정의에서 전달받은 인수를 함수 내부로 전달하기 위해 사용하는 변수를 의미한다.
인수 : 함수가 호출될 때 함수록 값을 전달해주는 값을 말한다.

Final : 변수에 final을 붙이면 이 변수는 수정할 수 없다는 의미를 가진다.
Static : Static 키워드를 통해 생성된 정적 멤버들은 Heap 영역이 아닌 Static 영역에 할당된다.
Static 영역에 할당된 메모리는 모든 객체가 공유하며 하나의 멤버를 어디서든지 참조할 수 있는 장점.

정수형 자료형의 오버플로 시 결과값

datatype overflow란?

java에서 산술연산을 할 경우 해당 변수의 자료형의 표현 범위를 초과할 경우
쓰레기값이 발생되는 경우를 말한다.

int a = 1000000;
int b = 1000000;
int c = a * b;
System.out.println(c);	// 결과 : -727379968

접근 제한자

Object 클래스

Object 클래스란?
모든 클래스에은 부모 클래스가 있다.

기본적으로 아무런 상속을 받지 않으면, java.lang.Object 클래스(이하 Object 클래스)를 확장한다.

왜 모든 클래스는 Object 클래스의 상속을 받을까?

Object 클래스에 있는 메소드들을 통해서 클래스의 기본적인 행동을 정의할 수 있기 때문이다.

Object 클래스에서 제공하는 메소드들의 종류

객체 처리를 위한 메소드

protected Object clone() : 객체의 복사본을 만들어 리턴한다.

public boolean equals(Object obj) : 현재 객체와 매개 변수로 넘겨받은 객체가 같은지 확인한다. 같으면 true를, 다르면 false를 리턴한다.

protected void finalize() : 현재 객체가 더 이상 쓸모가 없어졌을 때 가비지 컬렉터(garbage collector)에 의해서 이 메소드가 호출된다.

public Class<?> getClass() : 현재 객체의 Class 클래스의 객체를 리턴한다.
public int hashCode() : 객체에 대한 해시 코드(hash code) 값을 리턴한다. 해시 코드라는 것은 "16진수로 제공되는 객체의 메모리 주소"를 말한다.

public String toString() : 객체를 문자열로 표현하는 값을 리턴한다.

쓰레드 처리를 위한 메소드

public void notify() : 이 객체의 모니터에 대기하고 있는 단일 쓰레드를 깨운다.

public void notifyAll() : 이 객체의 모니터에 대기하고 있는 모든 쓰레드를 깨운다.

public void wait() : 다른 쓰레드가 현재 객체에 대한 notify() 메소드나 notifyAll() 메소드를 호출할 때까지 현재 쓰레드가 대기하고 있도록 한다.

public void wait(long timeout) : wait() 메소드와 동일한 기능을 제공하며, 매개 변수에 지정한 시간 만큼만 대기한다. 즉, 매개 변수 시간을 넘어 섰을 때에는 현재 쓰레드는 다시 깨어 난다. 여기에서의 시간은 밀리초로 1/1,000초 단위다.

public void wait(long timeout, int nanos) : wait() 메소드와 동일한 기능을 제공한다. 하지만 wait(timeout)에서 밀리초 단위의 대기 시간을 기다린다면, 이 메소드는 보다 자세한 밀리초 + 나노초(1/1,000,000,000초) 만큼만 대기한다.

추상 클래스와 인터페이스의 사용법

사용 이유

  • 설계시 선언해 두면 개발할 때 기능을 구현하는 데에만 집중할 수 있다.
  • 개발자 역량에 따른 메소드의 이름과 매개 변수 선언의 격차를 줄일 수 있다.
  • 공통적인 인터페이스와 abstract 클래스를 선언해 놓으면, 선언과 구현을 구분할 수 있다.

인터페이스의 사용

public interface MemberManager {
	public boolean addMember(MemberDTO member);
    public boolean removeMember(String name, String phone);
    public boolean updateMember(MemberDTO member);
}
public class MemberManagerImpl implements MemberManager {
	// 메소드 구현..
}

abstract 클래스의 사용

public abstract class MemberManagerAbstract {
	public abstract boolean addMember(MemberDTO member);
    public abstract boolean removeMember(String name, String phone);
    public abstract boolean updateMember(MemberDTO member);
    public void printLog(String data) {
    	System.out.println("Data=" + data);
    }
}
  • abstract 클래스는 클래스 선언시 abstract이라는 예약어가 클래스 앞에 추가되면 된다.
  • abstract 클래스 안에는 abstract으로 선언된 메소드가 0개 이상 있으면 된다.
  • abstract 클래스는 몸통이 있는 메소드가 하나라도 있으면, 그 클래스는 반드시 abstract으로 선언되어야만 한다.
  • abstract 클래스는 몸통이 있는 메소드가 0개 이상 있어도 전혀 상관이 없으며, static이나 final 메소드가 있어도 된다.

File 클래스의 메소드 이해

File 클래스는 객체를 생성하여 데이터를 처리한다.
File 클래스는 파일 및 경로 정보를 통제하기 위한 클래스다.
File 클래스는 생성한 파일 객체가 가리키고 있는 것이

  • 존재하는지,
  • 파일인지 경로인지,
  • 읽거나 쓰거나, 실행할 수 있는지
  • 언제 수정되었는지

를 확인하는 기능과 해당 파일의

  • 이름을 바꾸고,
  • 삭제하고,
  • 생성하고,
  • 전체 경로를 확인
    하는 등의 기능을 제공한다.

이 외에 File 객체가 가리키는 것이 파일이 아닌 경로일 경우에는 해당 경로에 있는

  • 파일의 목록을 가져오거나,
  • 경로를 생성하고,
  • 경로를 삭제하는
    등의 기능도 있다.

File 클래스의 생성자들을 살펴보자.

생성자

메소드

exists() : 해당 경로가 존재하는지 확인. 존재하면 true를, 존재하지 않으면 false를 리턴.

mkdir(), mkdirs() : 존재하지 않는 디렉터리를 만든다.
여기서 mkdir()은 디렉터리를 하나만 만들고, mkdirs() 메소드는 여러 개의 하위 디렉터리를 만든다.

isDirectory() : 경로에 있는 객체가 Folder이면 true 리턴 / 아니면 false 리턴

isFile() : 경로에 있는 객체가 File이면 true 리턴 / 아니면 false 리턴

isHidden() : 숨긴 파일인지 확인한다.

length() : 파일을 크기를 byte 단위로 반환한다.

delete() : 파일을 삭제한다. 예외적으로 비어있지 않은 디렉토리를 삭제할 경우 실패한다. 따라서 디렉토리 안을 비우고 삭제해야 한다.

배열과 리스트

데이터 추가

데이터 가져오기

InputStream is와 OutputStream os 메소드 이해

InputStream

OutputStream!

쓰레드 메소드

stop() : 쓰레드를 즉시 종료시킨다.
stop() 메소드로 스레드를 갑자기 종료하게 되면 스레드가 사용 중이던 자원(변수, 파일, 네트워크 연결 등)들이 불완전한 상태로 남겨지기 때문에 deprecated 됨

join() : 수행중인 쓰레드가 중지할 때까지 대기한다.

join(long millis) : 매개 변수에 지정된 시간만큼(1/1,000초) 대기한다.

join(long millis, int nanos) : 첫 번째 배개 변수에 지정된 시간(1/1000초) + 두 번째 매개 변수에 지정된 시간(1/1,000,000,000초)만큼 대기한다.

notify() : Object 객체의 모니터에 대기하고 이씨는 단일 쓰레드를 깨운다.

쓰레드 우선 순위

대기하고 있는 상황에서 더 먼저 수행할 수 있는 순위를 말한다.
getPriority() : 쓰레드의 우선 순위를 확인한다. int 반환

setPriority(int newPriority) : 쓰레드의 우선 순위를 지정한다.

데몬 쓰레드

어떤 쓰레드를 데몬 쓰레드로 지정하면, 그 쓰레드가 수행되고 있든, 수행되지 않고 있든 상관 없이 JVM이 끝날 수 있다.
단, 해당 쓰레드가 시작하기(start() 메소드가 호출되기) 전에 데몬 쓰레드로 지정되어야만 한다.

setDaemon(boolean on) : 쓰레드를 데몬으로 설정할지 아닌지를 설정한다.

isDaemon() : 쓰레드가 데몬인지 확인한다. boolean 반환

InterruptedException

interrupt() : 수행중인 쓰레드에 중지 요청을 한다.
쓰레드를 그냥 중지시키지는 않고, InterrupptedException을 발생시키며 중단시킨다.

sleep(), join(), wait() 메서드에서 호출 가능.

만약 쓰레드가 시작하기 전이나, 종료된 상태에서 interrupt() 메소드를 호출하면 예외나 에러 없이 그냥 다움 문장으로 넘어간다.

public class SleepThread extends Thread {
	long sleepTime;
    public SleepThread(long sleepTime) {
    	this.sleepTime = sleepTime;
    }
    public void run() {
    	try {
        	System.out.println("Sleeping " + getName());
            Thread.sleep(sleepTime);
            System.out.println("Stopping " + getName());
        } catch(InterruptedException ie) {
        	ie.printStackTrace()
        }
    }
}

다형성, 다중 상속, 추상화의 개념

다형성

다형성(polymorphism)이란 하나의 객체가 여러 가지 타입을 가질 수 있는 것을 의미합니다.
자바에서는 이러한 다형성을 부모 클래스 타입의 참조 변수로 자식 클래스 타입의 인스턴스를 참조할 수 있도록 하여 구현하고 있습니다.
다형성은 상속, 추상화와 더불어 객체 지향 프로그래밍을 구성하는 중요한 특징 중 하나입니다.

참조 변수의 다형성

class Parent { ... }
class Child extends Parent { ... }


Parent pa = new Parent(); // 허용
Child ch = new Child();   // 허용
Parent pc = new Child();  // 허용
Child cp = new Parent();  // 오류 발생.

참조변수의 타입 변환

class Parent { ... }
class Child extends Parent { ... }
class Brother extends Parent { ... }

Parent pa01 = null;
Child ch = new Child();
Parent pa02 = new Parent();
Brother br = null;
 
pa01 = ch;          // pa01 = (Parent)ch; 와 같으며, 타입 변환을 생략할 수 있음.
br = (Brother)pa02; // 타입 변환을 생략할 수 없음.
br = (Brother)ch;   // 직접적인 상속 관계가 아니므로, 오류 발생.

instance of 연산자

자바에서는 instanceof 연산자를 제공하여, 참조 변수가 참조하고 있는 인스턴스의 실제 타입을 확인할 수 있도록 해줍니다.
참조변수 instanceof 클래스이름

class Parent { }
class Child extends Parent { }
class Brother extends Parent { }
 
public class Polymorphism01 {
    public static void main(String[] args) {
        Parent p = new Parent();
        System.out.println(p instanceof Object); // true
        System.out.println(p instanceof Parent); // true
        System.out.println(p instanceof Child);  // false
        System.out.println();
 
        Parent c = new Child();
        System.out.println(c instanceof Object); // true
        System.out.println(c instanceof Parent); // true
        System.out.println(c instanceof Child);  // true
    }
}

다중 상속

자바에서는 class는 다중 상속을 지원하지 않는다.
하지만 interface는 implements를 통한 다중 상속을 지원한다.
그 이유는?

GrandFather 클래스에 A()라는 메서드가 구현되어있다.
A()를 Father 클래스에서 오버라이딩하여 구현하고 있다.
그러면 FatherA와 FatherB를 상속받은 Son 클래스는 무슨 A()를 사용할지 모른다.

인터페이스라면 기능 선언만 해두어서 충돌할 여지가 없다!

추상화

추상화란, 공통된 특징을 묶어 하나의 클래스로 정의하는 것을 말한다.

추상화 특징

-> 다중 상속이 불가능하다.
-> 추상 클래스에서는 일반 메소드도 같이 사용이 가능하다.

추상 클래스(Abstract Class)

자바에서는 하나 이상의 추상 메소드를 포함하는 클래스를 가리켜 추상 클래스라고 한다.
반드시 사용되어야 하는 메소드를 추상 클래스에 추상 메소드로 선언해 놓으면,
이 클래스를 상속받는 모든 클래스에서는 해당 추상 메소드를 반드시 재정의해야 한다.
이를 통해 각 개별 개체의 구체적인 구현에 대한 상세함을 갖출 수 있다.

-> 추상 클래스에서는 일반 메소드도 같이 사용이 가능하다.
-> 추상 클래스는 객체를 생성할 수 없다.

추상 메소드(Abstract Method)

자식 클래스에서 반드시 오버라이딩해야만 사용할 수 있는 메소드를 의미한다.
자바에서 추상 메소드를 선언하여 사용하는 목적은 추상 메소드가 포함된 클래스를 상속받는 자식 클래스가 반드시 추상 메소드를 구현하도록 하기 위함이다.

-> abstract 키워드를 메소드 앞에 붙여준다.
-> 추상 메소드는 추상 클래스 안에서 선언만하고, 실질적인 메소드의 추상 클래스를 상속받은 일반 자녀클래스에서 진행한다.
-> 추상메소드 뒤에 '{}'가 아닌 ';'을 붙인다.

끄트트ㅡ틍

profile
응애 Android 개발자

0개의 댓글