코테를 본격적으로 공부하려고 하니까 자바 기초가 덜 되어있음을 확 느끼게 되었다 ..
고로 공부할때마다 헷갈리는 기초 개념들을 정리해서 적을 예정 .. 🙄
- 문자열 비교
문자열이 같은지 비교할 때는 ==이 아니라 .equals() 메서드 사용
- switch문
switch (조건식) {
case value1 :
// 조건식의 결과 값이 value1일 때 실행되는 코드
break;
case value2 :
// 조건식의 결과 값이 value2일 때 실행되는 코드
break;
defalut;
// 조건식의 결과 값이 위의 어떤 값에도 해당되지 않을 때 실행되는 코드
}
- 삼항연산자
(조건식) ? a : b // 조건식이 true이면 a, false이면 b
- 배열 선언
int[] students; // 배열 변수 선언
students = new int[5]; // 배열 생성
int[] students = new int[5];
int[] students; // 배열 변수 선언
students = new int[] {90, 80, 70, 60, 50}; // 배열 변수 선언, 배열 생성과 초기화
int[] studnets = {90, 80, 70, 60, 50}; // 배열 초기화
- 2차원 배열
int[][] arr = new int[2][3];
arr[0][0] = 1;
arr[0][1] = 2;
arr[0][2] = 3;
arr[1][0] = 4;
arr[1][1] = 5;
arr[1][2] = 6;
int[][] arr = {
{1, 2, 3},
{4, 5, 6}
};
- 향상된 for문
int[] numbers = {1, 2, 3, 4, 5}
// 일반 for문
for (int i = 0; i < numbers.length; ++i) {
int number = numbers[i];
System.out.println(number);
}
// 향상된 for문
for (int number : numbers) {
System.out.println(number);
}
- 메서드 : 함수를 정의
- 인수(Argument) : 넘기는 값, 인수 또는 인자
메서드 내부로 들어가는 값
- 매개변수(Parameter) : 메서드를 정의할 때 선언한 변수, 매개변수 또는 파라미터
메서드를 호출할 때 인수를 넘기면 그 인수가 매개변수에 대입
중간에서 전달하는 변수로 메서드 호출부와 메서드 내부 사이에서 값을 전달하는 역할을 하는 변수
- void : 반환타입 void의 경우 return 생략
반환 타입이 있는 메서드는 return을 사용해서 값 변환
- 오버로딩 : 이름이 같고 매개변수가 다른 메서드를 여러개 정의
add(int a, int b)
add(int a, int b, int c)
add(double a, double b)
매개변수의 타입 및 순서가 다르면 가능, 반환 타입은 인정 X
- 클래스와 객체(인스턴스)
Student student1 = new Student() // Student 객체(인스턴스) 생성
클래스 - 객체가 가져야 할 속성(변수)과 기능(메서드)를 정의
객체 - 클래스에서 정의한 속성과 기능을 가진 실체
인스턴스 - 특정 클래스로부터 생성된 객체
모든 인스턴스는 객체 but 특정 클래스와의 관계를 명확히 할 때 인스턴스 용어 사용
(student1은 객체, student1은 Student의 인스턴스)
- 접근제어자
private(-) - 모든 외부 호출 막음
default(package-private)(~) - 같은 패키지안에서 호출은 허용
protecteed(#) - 같은 패키지안에서 호출은 허용, 패키지가 달라도 상속 관계의 호출은 허용
public(+) - 모든 외부 호출을 허용
- 스택 : 후입 선출(LIFO, Last In First Out)
- 큐 : 선입 선출(FIFO, First In Fist Out)
- static 변수 : 클래스 변수(정적 변수)
인스턴스와 무관하게 클래스에 바로 접근해서 사용, 클래스 자체에 소속
여러곳에서 공유하는 목적
프로그램 실행 시점에 만들어지고 종료 시점에 제거
- 인스턴스 변수 : static이 붙지 않은 변수
인스턴스를 생성해야 사용 가능, 인스턴스를 만들 때마다 새로 만들어짐
힙 영역에 생성, 동적으로 생성되고 제거됨
- static 메서드(클래스 메서드) : 인스턴스 생성 없이 클래스 명을 통해서 바로 호출
// DecoUtil 클래스
public static String deco(String str) {
String result = "*" + str + "*"
return result;
}
// DecoMain 클래스
public static void main(String[] args) {
String s = "hello java";
String decoo = DecoUil.deco(s); //클래스명 통해서 바로 호출
System.out.println(deco);
}
static 메서드는 static 메서드나 static 변수만 사용 가능 (참조값 없이 호출)
인스턴스 메서드나 인스턴스 변수 사용 X
- final : 값 변경 X, 최초 한 번만 할당 가능
- 자바 상수 : static final 키워드 사용
대문자 사용, 구분은 _로 함
고정된 값, 변경 X
- 상속 : extends 키워드 사용, extends 대상은 하나만 선택
상속 관계의 객체를 생성하면 그 내부에서는 부모와 자식이 모두 생성
객체 호출 시 대상 타입 정해야 함(호출자의 타입을 통해 대상 타입을 찾음)
현재 타입에서 기능 찾지 못하면 상위 부모 타입으로 기능 찾아서 실행
- 오버라이딩 : 부모에게서 상속 받은 기능을 자식이 재정의
@Override 애노테이션 사용
메서드 이름, 매개변수(파라미터), 반환 타입이 같아야 함
접근 제어자가 상위 클래스의 메서드보다 제한적이어서는 X
생성자는 오버라이딩 X
오버라이딩 된 메서드가 우선
- super : 부모 클래스 참조
상속 관계를 사용하면 자식 클래스의 생성자에서 부모 클래스의 생성자 반드시 호출
생성자의 첫 줄에 super() 사용해서 부모 클래스의 생성자 호출
(예외로 생성자 첫 줄에 this를 사용 가능, but super 반드시 호출해야함)
부모 클래스의 생성자가 기본 생성자면 super() 생략 가능
- 캐스팅
// 부모 변수가 자식 인스턴스 참조
Parent poly = new Child();
// poly.childMethod(); 자식의 기능 호출 불가
Child child = (Child) poly; // 다운캐스팅(부모 타입을 자식 타입으로 변경)
child.childMethod();
((Child) poly).childMethod(); // 일시적 다운캐스팅(해당 메서드 호출 순간만)
Parent parent1 = (Parent) child; // 업캐스팅은 생략 가능, 생략 권장
Parent parent2 = child; // 업캐스팅 생략
parent1.parentMethod();
부모는 자식을 담을 수 O
자식은 부모를 담을 수 X
- instanceof : 다운캐스팅 수행 위해 먼저 instanceof를 사용해서 원하는 타입으로 변경이 가능한지 확인한 다음에
다운캐스팅을 수행하는 것이 안전(런타임 오류 날수도 있기 때문)
Parent parent = new Parent();
Child child = new Child();
Parent parentChild = new Child(); // 업캐스팅
Child child = new Parent(); // 컴파일 오류
Child child = (Child) new Parent(); // 다운캐스팅, 런타임 오류
// 부모 -> 자식
parent instanceof Child // false
parentChild instanceof Child // true
parent instanceof Parent // true
// 자식 -> 부모
child instanceof Parent // true
child instanceof Child // true
if (parent instanceof Child child) { // 타입 확인 및 다운캐스팅
child.showParent();
child.showChild();
}
- 추상 클래스
// 추상 클래스
abstract class AbstractAnimal1 {
public abstract void sound();
public void move() {
System.out.println("동물이 움직입니다.");
}
// 순수 추상 클래스(바디 부분 X)
abstract class AbstractAnimal2 {
public abstract void sound();
public abstract void move();
}
new AbstractAnimal()와 같이 직접 인스턴스 생성 X
상속 받는 자식 클래스가 반드시 오버라이딩해서 사용
메서드 바디 부분 X
- 인터페이스
public interface InterfaceAnimal {
public abstract void sound();
public abstract void move();
}
public interface InterfaceAnimal {
void sound(); // public abstract 생략 가능, 생략 권장
void move();
}
순수 추상 클래스와 같음
(인스턴스 생성 x, 상속시 모든 메서드 오버라이딩, 주로 다형성을 위해 사용)
인터페이스의 메서드는 모두 public, abstract
다중 구현(다중 상속)을 지원
멤버 변수는 public static final이 모두 포함되었다고 간주
인터페이스를 상속 받을 때는 extends 대신에 implements 키워드 사용
- 하나의 클래스 여러 인터페이스
public class Bird extends AbstractAnimal implements Fly, Swim {
}
extends를 통한 상속은 하나만
implements를 통한 인터페이스는 다중 구현