자바 정리 2

OneTwoThree·2023년 1월 5일
0

자바

목록 보기
2/19

예외처리

예외 : 실행 시간 도중 발생한 오류

try-catch-finally 사용

public static void main(String[] args) {
		
		try {
			//예외 발생 가능성이 있는 실행문
		}catch(Exception e) {
			//예외 처리문
		} finally {
			// 예외 발생 여부와 상관없이 무조건 실행할 문장 
		}
		
	}

catch 문에서는 예외 타입을 선언한다
예외 타입을 모르겠으면 예외를 발생시켜 보고 확인해서 선언해도 된다.

예를 들어 0으로 나눠서 발생하는 예외는
ArithmeticException 타입을 사용하면 된다.

상속

부모 클래스(슈퍼 클래스) -> 자식 클래스(서브 클래스)

extends 키워드로 상속

class Person{
	String name;
	int age;
}

class Man extends Person{
	String gender;
}

Java 상속의 특징

  • 다중 상속을 지원하지 않음
  • 모든 클래스의 최상위 조상 클래스는 java.lang.Object 클래스임 (컴파일러에 의해 자동으로 처리함)

접근 지정자

  • public : 어디서나 접근 가능
  • default(접근 지정자 없이 사용) : 같은 패키지 내에서 접근 가능
  • private : 같은 클래스 내에서 접근 가능
  • protected : 같은 클래스 내에서 접근 가능 + (다른 클래스여도)상속받은 클래스 내에서 접근 가능

일반적으로 private 멤버에 접근하기 위해서 getter와 setter를 정의함.

생성자

서브 클래스의 생성자를 호출할 때 슈퍼 클래스의 생성자도 호출됨
호출 순서 : 서브 클래스 생성자 -> 슈퍼 클래스 생성자
실행 순서 : 슈퍼 클래스 생성자 -> 서브 클래스 생성자

  • 서브 클래스 생성자에서 슈퍼 클래스 생성자 선택하지 않는 경우
    자동으로 슈퍼 클래스의 기본 생서자 호출
    슈퍼 클래스의 기본 생성자 없으면 오류 발생
  • 서브 클래스에서 super()를 이용해 슈퍼 클래스 생성자 중 선택해서 호출할 수 있다
class Person{
	String name;
	int age;
	
	public Person() {
		name = "defaultName";
		age = 1;
	}
	public Person(String n,int a) {
		name = n;
		age = a;
	}
}

class Man extends Person{
	String gender;
	
	public Man(String n,int a,String g) {
		//super를 이용해 슈퍼 클래스의 생성자 중 두번째를 호출 
		super(n,a);
		gender = g;
	}
	
	
}

super는 슈퍼 클래스의 생성자를 호출할 때 뿐만 아니라 슈퍼 클래스의 멤버에 접근하기 위해 사용할 수도 있다.
super.멤버명 의 형태로 참조할 수 있다.

업캐스팅

서브 클래스 객체는 슈퍼 클래스 객체 취급 가능
슈퍼 클래스의 레퍼런스 변수로 서브 클래스 객체를 가리킬 수 있다. (자동 형변환 된다)
이렇게 하면 컴파일러는 객체를 슈퍼 클래스 객체로 인식한다.
따라서 슈퍼 클래스의 멤버에만 접근할 수 있다.


class Person{
	String name;
	int age;
	
	public Person() {
		name = "defaultName";
		age = 1;
	}
	public Person(String n,int a) {
		name = n;
		age = a;
	}
}

class Man extends Person{
	String gender;
	
	public Man(String n,int a,String g) {
		//super를 이용해 슈퍼 클래스의 생성자 중 두번째를 호출 
		super(n,a);
		gender = g;
	}
	
	
}


public class test {
	public static void main(String[] args) {
		
		Man m = new Man("haerin",20,"women");
		//슈퍼 클래스의 레퍼런스 변수인 p로 자식 클래스 객체인 m을 가리킴
		Person p = m;
		
		System.out.println(p.name);
		
		
	}
}

다운캐스팅

다운캐스팅은 업캐스팅 된 객체를 다시 서브 클래스로 형변환 하는 것이다. 명시적 형 변환을 통해 이루어진다.
업캐스팅 된 객체가 아닌 그냥 슈퍼 클래스 객체를 다운캐스팅 하면 예외 발생함

즉 위의 예시에서 p를 다시 (Man)p 로 다운캐스팅 할 수 있다.

instance of

instance of 로 레퍼런스 변수가 어떤 클래스 타입인 지 확인할 수 있다.
결과로 boolean 값을 반환한다.

메소드 오버라이딩

메소드 오버라이딩은 슈퍼 클래스의 메소드를 서브 클래스에서 재정의하는 것이다.
메소드 이름, 매개변수, 반환형 등 모든 내용을 동일하게 작성하고 내용만 바꾼다.
메소드를 호출하면 서브 클래스에 오버라이딩 된 메소드가 호출되는 동적 바인딩이 발생한다. 즉 run time에 호출될 메소드가 결정된다.

객체의 레퍼런스 타입에 상관없이 실제 클래스타입(생성한 타입)에 따라 메소드가 호출된다.

또한 메소드를 오버라이딩 할 때는 어노테이션 @Override를 붙이는 것이 좋다.

메소드 오버로딩

참고링크

<오버로딩의 조건>
1. 메소드의 이름이 같아야 합니다.

  1. 메소드의 시그니처, 즉 매개변수의 개수 또는 타입이 달라야 합니다.

주의 : 반환 타입과는 상관없다

추상 메소드

abstract 키워드 사용
선언은 되어 있으나 구현하지 않은 메소드다.
상속해서 서브 클래스에서 오버라이딩으로 구현해야 한다.

추상 클래스 추상 메소드가 하나 이상 포함된 클래스는
abstract 키워드를 붙여서 추상 클래스로 만들어야 한다.
추상 클래스는 객체를 생성할 수 없다.

추상 클래스를 상속한다고 무조건 추상 클래스가 되지는 않는다. 하지만 상속하고 나서 추상 메소드를 구현하지 않으면 추상 클래스가 된다.

인터페이스

상속은 속성(멤버변수)와 기능(멤버함수)를 모두 상속한다.
반면에 인터페이스는 기능만 상속하기 위해 존재한다.

인터페이스는 클래스가 구현해야 할 메소드들이 선언되는 추상형이다.

interface 키워드로 선언
implements 키워드로 상속

구성요소는
(public static) final 상수
(public abstract) 메소드
(public) default 메소드
로 구성된다. 괄호친 부분은 선언할 때 생략할 수 있다.

또한 괄호친 부분을 생략해서 선언하더라도 상속받는 클래스에서 메소드를 재정의 할 때는 public을 붙여야 한다.

default 메소드는 인터페이스 내에서 구현하는 메소드다. default 메소드는 상속하는 클래스에 자동으로 상속된다.

인터페이스는 멤버변수를 정의할 수 없다.
또한 protected 나 private 으로 선언할 수 없다.

인터페이스 객체는 생성할 수 없지만 인터페이스 타입의 레퍼런스는 생성할 수 있다.

  • 인터페이스는 다중 상속이 가능하다.
  • 인터페이스가 인터페이스를 상속할 수 있다

패키지

패키지가 필요한 이유는 다른 패키지에 있으면 이름이 같아도 다른 클래스로 취급해서 오류를 줄일 수 있음

package 키워드로 패키지 선언
소스 파일의 첫 줄에 선언한다

이 선언은 소스파일을 컴파일 한 클래스파일(.class)을 패키지 디렉토리를 만들어서 그 위치에 저장하라는 의미이다.

  • 디폴트 패키지
    디폴트 패키지는 package 선언문이 없이 만들어진 클래스의 패키이지다.
    디폴트 패키지는 현재 디렉토리로 설정된다.

즉 패키지는 서로 관련된 클래스들의 컴파일된 바이트코드 파일을 하나의 디렉토리에 묶어 놓은 것이다.

  • 다른 패키지에서 작성된 클래스를 사용하기 위해서 import 키워드를 사용함

import 패키지명.클래스명
예시) import java.util.Scanner;
또한 *를 이용해서 패키지의 모든 클래스를 포함할 수도 있다.
예시) import java.util.*;

주요 패키지들

java.lang
자바 language 패키지 (스트링, 수학 함수, 입출력 등 기본적인 클래스와 인터페이스)
자동으로 import 된다

java.util
자바 유틸리티 패키지이다.
날짜, 시간, 벡터, 해시맵 등 다앙햔 유틸리티 클래스, 인터페이스를 포함한다.

java.io
키보드, 모니터, 프린터 등 입출력을 할 수 있는 클래스, 인터페이스

Object 클래스

모든 클래스에 강제로 상속됨. 즉 모든 클래스의 슈퍼클래스

  • boolean equals(Object obj)
    obj가 가리키는 객체와 현재 객체를 비교해서 같으면 true 리턴
  • String toString()
    현 객채에 대한 문자열 표현을 리턴함

Wrapper 클래스

자바의 기본 타입을 클래스화 한 것이 Wrapper 클래스다

Byte
Short
Integer
Long
Character
Float
Double
Boolean


Wrapper 객체는 new로 생성할 수 없다.
valueOf()메소드를 사용한다.
값 대신 문자열을 넣어도 됨

Integer num = Integer.valueOf(10);
Integer num = Integer.valueOf("10"); 

//int to characeter (값, 진수)
char a = Character.forDigit(7,10);

Wrapper 클래스의 메소드는 대부분 static 메소드여서
클래스명.메소드명()으로 호출한다.

Integer num = Integer.valueOf(10);
int a = num.intValue();
int b = Integer.parseInteger("10");

//2진수로 변환 
int binary = Integer.parseInt("101010",2); 

String c = Integer.toString(10);

int를 예시로 들면
intValue 메소드로 기본 자료형의 값을 알 수 있다.
parseInteger 메소드로 문자열을 기본 자료형 값으로 변환할 수 있다.
toString 메소드로 기본 자료형 값을 문자열로 바꿀 수 있다.

모듈

모듈은 여러 패키지, 이미지 등의 자원을 모아 놓은 컨테이너다
.jmod 확장자를 갖는다.
클래스를 모아서 패키지를 만들고, 패키지를 모아서 모듈을 만듬
java API는 여러 모듈로 나눠져 있어서 그중에 필요한 모듈만 골라서 실행환경을 구축할 수 있다.

String 클래스

java.lang.String (자동으로 포함)

스트링 생성 방법

  • 리터럴로 생성
    String s = "Hello"
    JVM에 리터럴 테이블에 생성된다.
    같은 값의 스트링은 리터럴을 공유하는 형태가 된다

  • String 객체로 생성
    String s = new String("Hello");
    힙 메모리에 생성한다
    같은 값의 스트링이어도 객체는 따로 생성된다.


  • 스트링 객체는 수정할 수 없다
    스트링을 대상으로 하는 메소드들은 새로운 스트링 객체를 반환한다. 즉 원래 스트링은 변하지 않음

스트링 함수들

  • 스트링 비교 시 equals() 사용
  • int compareTo(String anotherString)
    문자열이 같으면 0 리턴
    대상 문자열이 anotherString보다 사전적 대소비교로 먼저 나오면 음수 리턴
    나중에 나오면 양수 리턴
  • String concat(String str)
    문자열 연결
    새로운 스트링 객체 리턴
  • String trim()
    앞 뒤의 공백문자를 제거한 문자열 리턴
  • char charAt(int index)
    index의 문자를 반환
    String은 equals로 비교하지만 char은 == 로 비교한다.
    또한 비교 대상은 문자이기 때문에 "a"가 아닌 'a'와 같이 작성해야한다. - String.length();
    문자열 길이는 length(); 메소드로 참조한다
  • String.startsWith(문자열); , String.endsWith(문자열);
    해당 문자열이 접두사나 접미사로 쓰이는지 확인해서 boolean 반환

StringBuffer 클래스

String 클래스와 달리 문자열을 변경할 수 있다
객체의 크기는 스트링 길이에 따라 가변적임


코테용 함수

다양한 코테용 함수는 이 링크 참고

split 함수를 이용해 String을 구분자를 기준으로 나눠서 배열에 담을 수 있다.

ArrayList, HashMap 등을 사용할 수 있다.

0개의 댓글