나의 공부 일기

Java) Java를 공부하며 혼자 필기한 내용입니다 1~2일치 필기 본문

Java/Java 필기

Java) Java를 공부하며 혼자 필기한 내용입니다 1~2일치 필기

곽병권 2024. 1. 4. 14:48
728x90
절차 지향 프로그래밍은 이름 그대로 절차를 지향한다. 실행 순서를 중요하게 생각하는 방식입니다.
프로그램의 흐름을 순차적으로 따르며 처리하는 방식입니다.
어떻게 를 중심으로


객체 지향 프로그래밍은 이름 그대로 객체를 지향합니다. 쉽게 이야기해서 객체를 중요하게 생각하는 방식입니다.
실제 세계의 사물이나 사건을 객체로 보고, 이러한 객체들 간의 상호작용을 중심으로 프로그래밍 하는 방식입니다.
무엇을 을 중심으로

절차 지향은 데이터와 해당 데이터에 대한 처리 방식이 분리되어 있습니다.
객체지향에서는 데이터와 그 데이터에 대한 행동이 하나의 객체 안에 함께 포함되어 있다.



패키지를 구성할때 관련 있는것끼리 묶어줘야됌.

접근 제어자의 종류
private : 모든 외부 호출을 막는다.
default(package-private) : 같은 패키지안에서 호출은 허용한다.
protected : 같은 패키지안에서 호출은 허용한다. 패키지가 달라도 상속 관계의 호출은 허용한다.
public : 모든 외부 호출을 허용한다.

하나의 자바 파일에는 하나의 public class 만 등장할 수 있습니다.
public class 는 파일명과 같아야함
default 접근 제어자를 사용하는 class 는 무한정 생성 가능함.


메서드 영역 : 클래스 정보를 보관한다. 이 클래스 정보가 붕어빵 틀이다
스택 영역 : 실제 프로그램이 실행되는 영역이다. 메서드를 실행할 때 마다 하나씩 쌓이다
힙 영역 : 객체(인스턴스)가 생성되는 영역이다. new 명령어를 사용하면 이 영역을 사용한다.
쉽게 이야기 해서 붕어빵 틀로부터 생성된 붕어빵들이 존재하는 공간입니다. 배열도 여기에 해당합니다


멤버 변수 : static 이 붙은 것과 아닌것에 따라 분류됌
인스턴스변수 : static이 붙지 않은 변수
    - 인스턴스 변수는 인스턴스를 만들 때 마다 새로 만들어짐

클래스 변수 : static이 붙은 변수
    - 클래스 변수, 정적 변수, 스태틱 변수 등으로 다양하게 불림
    - static이 붙은 멤버 변수는 인스턴스와 무관하게 클래스에 바로 접근해서 사용할 수 있고,
    클래스 자체에 소속되어 있음.
    - 클래스 변수는 자바 프로그램을 시작할 때 딱 1개가 만들어진다.
    - 인스턴스와는 다르게 보통 여러곳에서 공유하는 목적으로 사용됌


클래스 내부의 기능을 사용할 때, 정적 메서드는 static이 붙은 정적 메서나 정적 변수만 사용 가능합니다.
클래스 내부의 기능을 사용할 때, 정적 메서드는 인스턴스 변수나, 인스턴스 메서드를 사용할 수 없습니다.
반대로 모든 곳에서 static을 호출할 수 있습니다.


정적 메서드는 객체 생성이 필요 없이 메서드의 호출만으로 필요한 기능을 수핼할 때 주로 사용합니다.
간단한 메서드 하나로 끝나는 유틸리티성 메서드에서 자주 사용됌


기본 메서드는 main() 메서드임 이것 또한 정적 메서드임
그러므로 그 안에서 사용할때에도 static을 사용하여 추가적으로 메서드를 생성해 주었던 것임


자바에서 다중상속은 불가능하다.

메서드 오버로딩: 메서드 이름이 같고 매개변수(파라미터)가 다른 메서드를 여러개 정의하는 것을 메서드 오버로딩 이라고 합니다.
메서드 오버라이딩: 메서드 오버라이딩은 하위 클래스에서 상위 클래스를 재정의 하는 과정을 의미합니다.


protected : 같은 패키지안에서 호출은 허용한다.
패키지가 달라도 상속 관계의 호출은 허용한다.


상속에서
특정 타입으로 변경하는것을 캐스팅 이라고 한다.
부모 -> 자식 으로 캐스팅 하는것은 다운캐스팅
자식 -> 부모 로 캐스팅 하는것은 업캐스팅 이라고 합니다.


업캐스팅을 하면 문제는 생기지 않음
다운 캐스팅은 잘못사용한다면 심각한 런타임 오류가 생길 수 있다.


다형성을 이루는 또 하나의 핵심 이론은 바로 메서드 오버라이딩입니다.
메서드 오버라이딩에서 꼭 기억해야 할 점은 오버라이딩 된 메서드가 항상 우선권을 가진다는 점입니다.
그러므로 이름도 기존 기능을 덮어 새로운 기능을 재정의 한다는 뜻의 오버라이딩 입니다.

오버라이딩 되어있는 메서드는 항상 우선권을 가진다. 업캐스팅을 했어도 그 업캐스팅 한 메서드가 오버라이딩 되어있다면 그 값이 실행됌
더 하위 자식에서 오버라이딩 된 메서드가 우선권을 가진다.

객체지향 프로그래밍의 대표적인 특징으로는 캡슐화, 상속, 다형성이 있습니다.

a instanceof b 란
a 에 b를 대입할 수 있는지 없는지 확인하는것입니다.
업캐스팅일 경우에만 코드를 진행하고 싶을때 사용하는 방식입니다.



추상 클래스 : 부모 클래스는 제공하지만, 실제 생성되면 안되는 클래스를 추상 클래스 라고 합니다.
            추상적인 개념을 제공하는 클래스이며, 실체인 인스턴스가 존재하지 않습니다.
            대신 상속을 목적으로 사용되고, 부모 클래스 역할을 담당합니다.
추상 클래스는 클래스를 선언할 때 앞에 abstract 를 붙여줍니다.
이는 직접 new 인스턴스(); 와 같이 인스턴스를 직접 생성하지 못합니다.

추상 메서드 : 부모 클래스를 상속 받는 자식 클래스가 반드시 오버라이딩 해야하는 메서드를 부모 클래스를 정의 할 수 있습니다.
            추상적인 개념을 제공하는 메서드이며 실체가 존재하지 않고, 메서드 바디가 없습니다.

            추상 메서드가 하나라도 있는 클래스는 추상 클래스로 선언해야 합니다.

추상 클래스에 추상 메서드가 있는경우 이를 상속받는 클래스는 반드시 오버라이딩을 하여 추상 메서드를 사용해주어야 합니다.
그렇지 않은 경우 상속받는 클래스도 추상 클래스로 변경해주어야 합니다.


추상 클래스는 제약이 추가된 클래스라고 보면 됩니다.

인텔리제이 유용한 단축키
1. [Alt + Enter]
   오류가 발생한 코드부분에서 Alt + Enter 를 누르면 오류를 해결할 방법을 알려줍니다.

2. [Ctrl + Alt + M]
     public static void main(String[] args){
            ..... 생략

           for (Animal animal : animals) {
               System.out.println("동물 소리 테스트 시작");
               animal.sound();
               System.out.println("동물 소리 테스트 종료");
           }
    }

           이 for문을 드래그 후 Ctrl + Alt + M 을 한다면

      ┌
       public static void main(String[] args){
           ..... 생략

           for (Animal animal : animals) {
               soundAnimal(animal);
           }
       }

       private static void soundAnimal(Animal animal) {
           System.out.println("동물 소리 테스트 시작");
           animal.sound();
           System.out.println("동물 소리 테스트 종료");
       }
                                                           ┘

       이렇게 자동으로 드래그 한 부분을 메인 메서드 밖으로 빼내어 생성 후 사용하는것으로 변경해줍니다.
728x90