T_era

[JAVA] 문법정리 본문

Programing/Java

[JAVA] 문법정리

블스뜸 2025. 4. 15. 12:33

1. 객체와 인스턴스란?
 객체는 속성과 기능 등을 하나로 묶어 설계도를 따라 만들어진 결과물
 인스턴스는 구체적인 실체 객체.속성 객체.메서드 등의 실체를 인스턴스라 한다
 "나는 Car 객체를 가지고 있다." (일반적인 의미)
 "myCar는 Car 클래스의 인스턴스이다." (클래스와의 관계를 명확히 할 때)
 "우리는 Person 클래스의 여러 객체를 생성했다." (여러 실체를 언급할 때)
 "이것은 Book 클래스의 새로운 인스턴스이다." (새롭게 생성됨을 강조할 때)
 객체는 조금 추상적인 표현
 인스턴스는 실체를 명확히하는 표현

2. this
 this는 static에서는 절대 사용할 수 없다
 class는 static으로 선언할 수 없다
 단, class 내부의 메서드나 속성들은 static을 사용할 수 없다
 그러므로 class 내부에서 this를 사용할 수 있지만
 class 내부의 static메서드에서는 this를 사용할 수 없다

3. 메모리 영역
 stack 영역(Frames)과 heap 영역(Objects) 그리고 메서드 영역
 지역 변수 등은 스택에 저장
 클래스를 객체로 선언하면 객체는 스택에 생성되는데
 해당 객체의 내용은 힙에 들어있는 데이터를 가르키게된다
 즉 new 키워드로 생성한 데이터는 힙영역에 들어가게된다
 Person person = new Person(1,2);
 이 코드가 있으면
 Person person은 stack에 들어가고
 new Person(1,2)로 초기화한 내용은 heap에 들어간다
 메서드 영역은 static영역이다
 프로그램이 실행될 때 딱 한번만 실행된다
 과정
 main 실행 -> 스택 1 push
 Person person = new Person(1,2); -> person은 스택1에 포함하고 내용은 힙1에 저장. 메모리 주소를 통해 상호작용
 introduce() -> 스택2 push
 System.out.println() -> 스택2 pop하고 실행
 만약 메서드 영역에 static메서드가 존재하고
 main에서 호출하면 해당메서드도 스택에 들어와서 실행한다

4. 래퍼클래스
 기본형 변수와 참조형 변수
 - 기본 자료형을 감싸고있는 클래스
 - 가볍게 구현하면 아래와 같다
 class Integer{
     int value;
     Integer(int value){
         this.value = value;
     }
 }
기본형 변수를 참조할 수 있도록 클래스 형태로 만들어 둔 것

하지만 래퍼클래스는
 Integer i = 100;
 처럼 바로 값을 넣어줄 수 있다
 오토박싱, 언박싱 개념에 연관되어 있다
 Integer i = 100; -> 오토박싱 : Integer 내부에서 valueOf라는 메서드를 사용해 객체를 생성해준다
 System.out.println(i) -> 오토 언박싱 : 객체를 바로 사용해도 참조주소가 아니라 값이 나온다. intValue라는 내부 메서드를  통해 값을 리턴해준다

5. static
 public class Test{
 static int t = 0;
     static void tt(){
         System.out.println(t);
     }
 }

 Test.tt()
 이 형태로 직접적으로 사용가능하다
 그리고 마찬가지로 객체선언도 가능하다
 
 
 // 아래 코드의 출력은 전부 1이 된다 그리고 test와 test2의 주소를 출력해보면????
 public class Main {
     public static void main(String[] args) {
         Test test = new Test();
         Test.tt();
         System.out.println(test.t);
         Test test2 = new Test();
         System.out.println(test2.t);
     }
 }
 class Test{
     static int t =0;
     static void tt(){
         t++;
         System.out.println(t);
    } 
 }  
이유는 언제 어디서 어떻게 선언을 해도 static으로 선언된 이상 메서드 영역에 있는 데이터를 가르키게된다
하지만 test와 test2의 주소를 확인해보면 서로 다른데 이는 값을 공유해도 객체는 다르다고 볼 수 있어서 이다
그렇다면 이런 경우 서로 다른 객체를 만들 필요가 있을까? 만들 수 있다
static 변수와 일반 인스턴스 변수를 같이 사용할경우 필요가 있을 수 있다

6. final : 상수
 보통 상수는 프로그램이 시작하고 절대 변경되면 안되는 변수이기 때문에
 static final을 같이 사용한다

7. 인터페이스
 인터페이스는 표준 규격만 제공하는게 올바르지만 
 변수를 선언 해야하는 경우가 있으면 반드시 static final로 선언된다
 다중상속
 interface a1(){}
 interface a2(){}
 interface b1 extands a1, a2(){}
 class c1 implements b1(){
     a1 a2 b1 다 정의해야한다
 }

8. 객체지향 프로그래밍
 8-1. 캡슐화
 캡슐화 : 데이터를 보호하는 개념, 누군가가 데이터를 수정하지 못하게 하기위해 사용
  - 정보은닉 : 객체 내부데이터를 숨기는 개념
  - 접근제어자 : 클래스, 메서드, 변수의 접근 범위를 제어하는 기술
 a) 범위 public(protected(default(private)))
 b) public : 전체 공개
 c) protected : 클래스 내부, 패키지 내부, 상속한 클래스
 d) default : 클래스 내부, 패키지 내부 (명시해주지 않으면 이게 기본값)
 e) private : 클래스 내부
  
  - 무분별한 세터 : 의미있게 세터를 활용하는 방법
 a) 기껏 내용을 보호했는데 setter를 그냥 사용하게 되면 보호한 이유가 없어진다
 b) 그래서 setter내부에서 조건이나 예외처리를 통해 접근 불가한 사항을 작성해 구분할 수 있게한다

8-2. 상속
 상속 : 부모의 내용을 상속받아 자식에서 사용하는 기술
  - 재사용성이 좋다
  - 확장 상속받은 자식 클래스에서 필요한 기능확장이 용이
  - super : 자식에서 부모의 인스턴스를 지명하는 방법 부모가 여럿이면 모든 부모의 인스턴스를 사용할 수 있다
 *** 자식을 만들 때 항상 생성자에서 super()를 호출해 부모의 생성자를 먼저 생성해야한다
  - 오버라이딩 : 부모의 기능을 자식클래스에서 재정의 하는 것
  - 추상클래스(abstract class) : 부모자식이 같은 메서드를 공유하면서 오버라이딩을 강제하는 방법
  *** abstract class에서 abstract 메서드를 생성하면 상속받을 때 구현을 강제한다
  *** 그리고 인스턴스화 시킬 수 없다
 
  **인스턴스와 추상클래스의 차이점**
 1. 상속은 계층구조를 선언하기 적합하다 
 2. 인터페이스는 표준을 제공하는데 적합하다
 3. 인터페이스는 인스턴스 변수를 선언할 수 없다
 결론 : 계층 구조를 표현하면서 공통 속성과 기능을 재사용할 때 사용하는 것이 적합하다

 ** 계층 구조? **
 - 클래스 간의 "is-a"관계를 의미한다
 - 부모클래스의 모든 속성과 기능을 물려받고 "필요에 따라" 확장이나 특화할 수 있다
 - 마치 나뭇가지처럼 뻗어나가는 구조
 
 ********상속은 재사용의 관점 인터페이스는 규격을 만드는데에 관점을 두고 구분하자**************

 8-3. 추상화
  - 불필요한 정보를 제거하고 본질적인 특징만 남기는 것
  ex) 고양이의 추상화 -> 동물, 동물의 추상화 -> 생명체 =========이게 계층구조`
  - interface LifeForm.살아있다
  - interface Animal.소리를 낸다
  - interface Cat.긁는다 

 8-4. 다형성
  - 하나의 타입으로 여러 객체를 다루는 것
  ex) Animal animal = new Cat(); Animal animal2 = new Dog();
  - 업 캐스팅 : 자식타입 -> 부모타입 
  주의) 업캐스팅을하면 자식의 고유 기능을 이용할 수 없다
    즉 Animal animal = new Cat();이면 Cat의 기능을 이용할 수 없다 
  - 다운 캐스팅 : 부모타입 -> 자식타입
 Cat cat2 = (Cat) animal;
  주의) 잘못된 캐스팅은 컴파일에서 감지할 수 없다
  ex) Cat cat3 = (Cat) animal2; -> animal2는 Dog인데 오류가안남
  ** 다운캐스팅시 instanceof 활용법
  if(animal2 instanceof Cat){
     Cat cat3 = (Cat) animal2;
  }else{ 
     System.out.println("고양이아니야");
  }
 이렇게 활용할 수 있다
 
다형성의 응용
Animal[] animals = {new Cat(), new Dog()};
이렇게 사용할 수 있다.
이때 조건탐색에 instanceof를 사용하면 좋은 연계를 할 것 같다.

'Programing > Java' 카테고리의 다른 글

[JAVA] 제너릭의 타입보장  (0) 2025.04.18
[JAVA] 문법정리 - 2  (0) 2025.04.15
[JAVA] Map에 객체를 value로 하기 위한 메서드  (0) 2025.04.14
[JAVA] 힙정렬 구현하기  (0) 2025.04.03
[JAVA] 병합정렬 구현하기  (0) 2025.04.02