Langauge/Java-basic

    [Java] 업 캐스팅과 다운 캐스팅

    [Java] 업 캐스팅과 다운 캐스팅

    타입에 따른 업캐스팅과 다운캐스팅 기본자료형 업캐스팅 : 범위가 좁은 쪽에서 넓은 쪽으로 캐스팅 다운캐스팅 : 범위가 넓은 쪽에서 좁은 쪽으로 캐스팅 객체 업캐스팅 : 하위 클래스에서 상위 클래스로 캐스팅 다운캐스팅 : 상위 클래스에서 하위 클래스로 캐스팅 객체의 업 캐스팅과 다운 캐스팅 객체의 업 캐스팅은 항상 할 수 있으며, 명시적으로 적어주지 않아도 컴파일러가 대신 넣어준다. 객체의 다운 캐스팅은 반드시 명시적으로 적어주어야 하며, 또한 명시적으로 적어도 다운 캐스팅 자체가 안 될 때가 있다. 잘못된 다운 캐스팅을 수행하면 'ClassCastException'이라는 예외가 발생하며 프로그램이 종료된다. public class Main { public static void main(String[] a..

    [Java] 상속 관계와 포함 관계

    [Java] 상속 관계와 포함 관계

    상속 상속이란 상속이란 기존 클래스를 재사용하여 새로운 클래스를 작성하는 자바의 문법 요소로 상위 클래스의 멤버를 내려받아 하위 클래스 내부에 포함시키는 역할을 한다. 여기서 기존 클래스는 상위(부모) 클래스, 새로운 클래스는 하위(자식) 클래스라고 한다. 상위 클래스와 하위 클래스는 서로 상속 관계라고 하며, 하위 클래스는 상위 클래스가 가진 모든 멤버를 상속받는다. '하위 클래스는 상위 클래스로부터 확장되었다'라고 표현한다. 상속 관계로 정의하기 위해서는 '하위 클래스는 상위 클래스다' 라는 조건이 참이어야 한다. -> ex. '고양이는 동물이다.'(상속 가능) / '취준생은 학생이다.' (상속 불가능) 상속의 장점 코드의 중복성 제거 클래스의 다형적 표현 가능 다형성 : 1개의 객체를 여러 가지로 ..

    [Java] final 키워드

    final 변수 final 키워드는 변수를 선언할 때 지정하며, 한 번 초기화된 값은 최종값으로 재할당할 수 없다. (변경 불가) 변경의 범위는 그 변수의 값에 한정된다. 클래스 내의 필드는 초기화를 하지 않으면 자동으로 강제 초기화가 되지만 final 변수는 강제 초기화되지 않는다. (지역 변수, 필드 관계없음) final로 선언된 변수는 초기화될 때 상수 영역에 필드와 값이 복사된다. final 자료형 변수명; // 예시 public class Main { public static void main(String[] args) { final MyClass1 mc = new MyClass1(10, 10); // num1 = 10, num2 = 10 mc.num1 += 10; // '변경의 범위는 그 변수..

    [Java] static 키워드

    [Java] static 키워드

    static 키워드 static은 클래스의 멤버(필드, 메서드, 이너 클래스)에 사용하는 키워드 static 키워드가 붙은 멤버를 '정적 멤버'라고 부르며, 인스턴스 생성 없이 '클래스명.멤버명'만으로 사용할 수 있다. 정적 멤버는 인스턴스를 생성한 후 참조 변수를 통해 사용할 수도 있지만, 정적 멤버임을 나타내기 위해 권장 x 정적 필드 메모리가 독립되어 있다. -> 정적 필드는 클래스 내부에 저장 공간을 지니며, 인스턴스 내부에는 실제 정적 필드의 저장 공간의 주소값만 포함하고 있다. 정적 필드는 객체 간 공유 변수의 성질을 가지고 있다. 이러한 특징으로 정적 필드를 클래스별로 관리하는 '클래스 필드'라고 한다. public class Main { public static void main(Strin..

    [Java] 접근 제어자 public / protected / default / private

    접근 제어자 접근 제어자는 자바 제어자의 한 종류로, 사용 범위를 정의하는 역할을 한다. 접근 제어자는 각 대상에 대해 딱 한 번 정의할 수 있다. 접근 제어자는 클래스, 멤버, 생성자 앞에 위치할 수 있다. 아무것도 지정하지 않으면 default 접근 제어자가 자동으로 설정된다. 멤버 및 생성자의 접근 제어자 멤버 및 생성자에는 public, protected, default(package), private라는 4가지 종류의 접근 제어자를 사용할 수 있다. 접근 제어자 접근 제한 범위 public 접근 제한 없음 protected 동일 패키지 + 다른 패키지의 하위 클래스에서 접근 가능 default 동일 패키지 내에서만 접근 가능 private 동일 클래스에서만 접근 가능 사용 가능 범위 : publ..

    [Java] 이너 클래스

    [Java] 이너 클래스

    이너 클래스(Inner Class) 이너 클래스는 클래스 내부에 포함되는 클래스로, 외부 클래스와 내부 클래스가 서로 연관되어 있을 때 사용한다. 이너 클래스를 사용하면 접근 지정자와 관계없이 외부 클래스의 멤버들에 쉽게 접근할 수 있고, 코드의 복잡성을 줄일 수 있다. 또한 외부적으로 불필요한 데이터를 감출 수 있어 캡슐화를 달성하는데 유용하다. 이너 클래스는 인스턴스 멤버 이너 클래스, 정적 멤버 이너 클래스, 지역 이너 클래스로 나뉜다. 이너 클래스도 클래스이기 때문에 바이트 코드(.class) 파일이 생성된다. // 외부 클래스 class Outer { // 인스턴스 멤버 이너 클래스 class Inner { } // 정적 멤버 이너 클래스 static class StaticInner { } vo..

    [Java] 외부 클래스

    외부 클래스(external class) 1개의 자바 소스 파일에는 1개의 public class만 존재할 수 있다. 소스 파일 내의 1개의 public class를 제외한 모든 클래스를 외부 클래스라고 한다. 외부 클래스는 다른 패키지에서 임포트할 수 없으며, 같은 패키지 내에서만 사용할 수 있다. 외부 클래스를 다른 패키지에서 사용하려면 외부 클래스를 별도의 소스파일로 분리 후 public class로 변경해야 한다. public class MyClass1 { // public 클래스, 다른 패키지에서 임포트 가능 ... } class MyClass2 { // 외부 클래스, 다른 패키지에서 임포트 불가능 ... } // ===================== 구분선 ===================..

    [Java] this키워드와 this() 메서드

    this. 키워드 자신이 포함된 클래스의 객체를 가리키는 역할을 하며 this. 키워드를 통해 인스턴스 변수에 접근할 수 있다. 일반적으로 키워드를 생략하면 컴파일러가 자동으로 추가한다. 생략하면 컴파일러가 자동으로 추가하는데 그럼 언제 사용할까? -> 메서드를 선언한 후 매개변수와 인스턴스 변수의 이름이 동일할 때 구분하기 위하여 사용된다. class Cat { String name; int age; double weight; public Cat(String name, int age, double weight) { // 생성자를 통해서 인스턴스를 초기화할 때 // 매개변수와 인스턴스 변수를 구분하기 위해 this. 키워드 사용 this.name = name; this.age = age; this.wei..

    [Java] 생성자

    생성자란 생성자란 인스턴스 변수들을 초기화하는 역할을 지닌 클래스의 내부 구성 요소로 new 키워드와 함께 쓰여 인스턴스를 생성한다. 생성자의 이름은 반드시 클래스명과 동일해야 한다. 생성자는 리턴 타입이 존재하지 않는다. 기본 생성자와 매개변수가 있는 생성자 기본 생성자 : 매개변수가 없는 생성자 기본 생성자란 매개변수가 없는 생성자를 의미함. 모든 클래스는 생성자를 포함하고 있어야 한다. 따라서 클래스 내부에 생성자가 없을 경우 컴파일러가 자동으로 추가함. // 기본 생성자 구조 클래스명(){ ... } class Person() { public Person() {} // 기본 생성자 } class Person() { ... // public Person() {} 클래스 내부에 생성자가 하나라도 없으..

    [Java] 메서드 시그니처와 메서드 오버로딩

    [Java] 메서드 시그니처와 메서드 오버로딩

    메서드 시그니처(Method Signature) 메서드 시그니처란 메서드명과 매개변수의 자료형을 의미 메서드의 반환 타입은 해당되지 않는다. 메서드 오버로딩(Method Overloading) JVM은 메서드명이 동일해도 매개변수의 자료형 또는 개수가 다르면 다른 메서드라고 인식한다. 위의 특징을 이용하여 하나의 클래스 안에 동일한 이름의 메서드를 여러 개 정의하는 것을 메서드 오버로딩이라 한다. public class Main { public static void main(String[] args) { MyClass mc = new MyClass(); mc.print(1); mc.print(1, 10); mc.print('X'); mc.print("메서드 오버로딩"); } } class MyClass ..