-
클래스,인스턴스 메서드 메모리 저장,싱글톤,접근제한자언어/JAVA 2023. 7. 6. 15:57
1. 객체지향 프로그래밍
-소프트 웨어를 개발할 때도 부픔에 해당하는 객체들을 먼저 만들고, 객체들을 하나씩 조립해서 완성된 프로그램을 만드는 기법
> 객체란?: 물리적으로 존재하거나 개념적인 것 중 다른 것과 식별 가능한 것
- 객체는 속성과 동작으로 구분된다.
- 현실 세계의 객체를 소프트웨어 객체로 설계하는 것을 객체 모델링이라고 한다.
- 현실 세계 객체의 대표 속성과 동작을 소프트웨어 객체의 필드와 메서드로 정의할 수 있다.
> 객체간 상호작용은 메서드를 통해 이루어진다. ( 객체가 다른 객체의 기능을 이용할 때 메소드 호출함)
> 객체 간 관계는 집합,사용,상속 관계로 분류할 수 있다.
집합 : 완성품과 부품관계
사용: 다른 객체의 필드를 읽고 변경하거나 메서드를 호출하는 관계( 사람(객체) 자동차(객체) 이용)
>객체 지향 프로그래밍의 특징 : 캡슐화,상속,다형성
상속을 하는 이유 : 코드재사용성, 유지보수시간 최소화
다형성: 사용방법은 동일하지만, 실행결과가 다르게 나타나는 것 ( 오버라딩+ 자동형변환)
2. 객체와 클래스
- 클래스는 객체의 설계도에 해당한다.
- 클래스로부터 생성된 객체를 클래스의 인스턴스라고 부른다.
*클래스의 두가지용도
> 라이브러리 : 실행x 다른 클래스에서 이용
> 실행: main메서드를 가지고 실행 가능한 클래스
3. 클래스의 구성 멤버
-필드 : 데이터 저장 역할, 변수와 비슷하지만 쓰임새는 다름
필드는 용도에 따라 고유데이터, 상태, 부품(타클래스)로 분류할 수 있다.
-생성자: 객체 초기화 담당
- 메서드 : 객체가 수행할 동작
4. 필드
- 클래스로부터 객체가 생성된 이후에 사용가능
- 객체마다 다른 값을 가져야한다면, 생성자를 통해 초기화하자
5. 메서드
- 객체의 동작 정의
- 객체 내부 혹은 외부에서 호출 될 수 있음, 외부에서 호출되려면 객체가 생성되어있어야함
- 가변길이 매개변수 -> 매개변수 개수와 상관없이 매개값을 줄 수 있다. (내부적으로 배열로 저장됨 -> 걍 배열 넣어도된다)
-메소드 오버로딩 : 이름만 같고 완전 다른것 (매개변수 타입,개수 등등 달라야함)
6. 인스턴스 멤버 vs 정적 멤버
- 필드와 메서드는 인스턴스 멤버와 정적 멤버로 분류할 수 있다.
인스턴스 멤버 객체에 소속(객체 생성시에 사용가능) 정적 멤버 클래스에 소속된 멤버(객체 없이 사용가능)
- 정적 메소드 혹은 블럭은 인스턴스 필트나 메소드 사용x
> 객체 생성해서 사용해야함*정적멤버는 메모리 메서드영역(바이너리코드 해석과 동시에 한번만 로딩됨) 인스턴스 멤버는 힙메모리(동적으로 생성과 소멸)
- 인스턴스 변수
객체별 다른값
생성된 객체.변수로 사용
초기값을 줘도 괜찮고, 일반적으로 생성자를 통해 초기화
- static변수
클래스 공유 값
클래스명.변수로 사용
일반적으로 생성과 동시에 초기값을 준다. (복잡한 초기화 작업이 필요하다면, 정적 초기화 블럭 사용)
(static 초기화 블럭은 메모리가 로딩될 때 실행됨!)
- 인스턴스 메서드 vs 정적 메서드
공통점: - 컴파일 과정에서 metaspace라는 특별한 공간(native)에 정보가 생성된다.
- 메소드에 구성된 파라미터, 지역변수, 반환 값등은 stack영역에 저장됨
- (인스턴스 변수는 stack에 저장 x)
- *인스턴스 메서드라고해서 객체 생성시마다 계속 생성되는 것 아니다. 참조해서 사용
차이점:
> 인스턴스 메서드
- 객체에 소속됨 (클래스 소속x)
- 오버라이딩이 가능하다. 따라서 런타임 중 동적 바인딩을 통해 메서드가 결정된다.
> static 메서드
- 클래스에 소속(클래스가 로딩될 때 한번 등록됨)
- 따라서 객체 생성없이 호출 가능, 일반적으로 생각하는 함수에 가장 가깝다.(절차)
- 같은 클래스로 생성된 객체간 같은 코드로 처리하는 것을 보장함
- 오버라이딩이 되지 않음으로, 컴파일 과정에서 정적 바인딩이 되어, 메서드 타입이 결정된다.
(*자식클래스에서 부모클래스와 같은 정적메서드를 정의할 수 있지만, Methodhiding으로 항상 상위 클래스 정적메서드만 호출됨)
각 객체는 자신의 메서드 주소(metaspace에 생성된) 맵핑정보를 가지고 있다. 오버라이딩을 통한 동적 바인딩은 위와 같이 객체를 전달하는 시점에서 메서드가 결정되는 것으로 처리된다.
7. final 필드와 상수
final 필드는 상수형 필드로 필드 선언시 값이 대입되거나, 생성자를 통해 대입된다.
final static 필드는 상수로 선언시 초기화 해줘야한다.
final 메서드, 클래스 : 각각 오버라이딩 혹은 상속 불가
8. 패키지
- 자바에서 패키지는 클래스의 일부로 클래스를 식별하는 용도로 사용된다.(클래스 전체 이름에 포함된다.)
- 패키지에 속한 바이트코드 파일은 따로 떼어내어 다른 디렉토리로 이동할 수 없다.
9. 접근 제한자
public protected default private
접근제한자에 따라 생성과 호출 범위가 결정됨(읽고,변경)
클래스, 인터페이스 -> public default (타 패키지에서 import시 사용할 수 있는 것과 없는 것)
생성자 -> public, default,private
10 싱글톤 패턴
- 애플리케이션 전체에서 단 한 개의 객체만 생성하여 사용하는 것
- 핵심은 생성자를 private로 막는 것
public class A{ private static A staticInstance = new 클래스() // 메모리 로딩시 하나 생성되도록 static에 클래스 생성 private 클래스() {} // private 접근 권한을 갖는 생성자 public static A getInstance(){ return this.A; } } //외부에서 A ins1 = A.getInstance(), A ins2 =A.getInstance() 사용시 -> 같은 객체 가리킴
* 한번에 new만 이루어지도록.. 잘 구성
'언어 > JAVA' 카테고리의 다른 글
중첩 선언과 익명 객체 (0) 2023.07.07 상속,동적생성 (0) 2023.07.06 참조타입,메모리,배열복사 (0) 2023.07.06 인터페이스 (0) 2023.07.06 람다식 (0) 2023.07.05