본문 바로가기
Hello World/JAVA

JAVA - 객체지향 프로그래밍 / oop 필드, 생성자, 클래스 / 오버로딩 인스턴스 멤버, 정적 멤버 [개발스터디 기몬]

by 기몬 2023. 3. 27.
728x90
반응형


필드 선언과 사용 

 필드 선언
- 필드는 클래스 블록에서 선언되어야 함 
타입 필드면 [=  초기값];
- 타입은 필드에 저장할 데이터의 종류를 결정. 기본타입, 참조타입 모두 가능
- 초기값을 제공하지 않을 경우 필드는 객체 생성 시 자동으로 기본값으로 초기화

 필드 사용 
- 필드값을 읽고 변경하는 것. 
클래스로부터 객체가 생성된 후에 필드를 사용할 수 있음
- 필드는 객체 내부의 생성자와 메소드 내부에서 사용할 수 있고, 
객체 외부에서도 접근해서 사용할 수 있음.

생성자 선언과 호출 

 기본생성자 
- 클래스에 생성자 선언이 없으면 컴파일러는 기본 생성자를 바이트코드 파일에 자동으로 추가 
[public] 클래스() {     }

 생성자 선언 
- 객체를 다양하게 초기화 하기 위해 생성자를 직접 선언 할 수 있음
클래스 ( 매개변수 , ... ) {
// 객체의 초기화 코드
} ///* 생성자 블록

- 생성자는 메소드와 비슷한 모양을 가지고 있으나, 리턴 타입이 없고 클래스 이름과 동일
- 매개변수의 타입은 매개값의 종류에 맞게 작성

필드 초기화 
- 객체마다 동일한 값을 갖고 있다면 필드 선언 시 초기값을 대입하는 것이 좋고, 
객체마다 다른 값을 가져야 한다면 생성자에서 필드를 초기화 하는 것이 좋음 

생성자 오버로딩
- 매개변수를 달리하는 생성자를 여러개 선언하는 것.
[생성자 오버로딩] : 매개변수의 타입, 개수, 순서가 다르게 여러 개의 생성자 선언

- 매개변수의 타입, 개수, 선언된 순서가 똑같을 경우 
매개변수 이름만 바꾸는 것은 생성자 오버로딩이 아님

- 생성자가 오버로딩되어 있을 경우, new 연산자로 생성자를 호출할 때 
제공되는 매개값의 타입과 수에 따라 실행될 생성자가 결정


다른 생성자 호출 
- 생성자 오버로딩이 많아질 경우 생성자 간의 중복된 코드가 발생할 수있음
- 이 경우 공통 코드를 한 생성자에만 집중적으로 작성하고, 
나머지 생성자는 this(..)를 사용해 공통 코드를 가진 생성자를 호출


메소드 선언과 호출

메소드 선언 
- 객체의 동작을 실행 블록으로 정의 하는 것
(리턴타입 : 메소드가 리턴하는 값의 타입 표시)
(매개변수 : 메소드가 실행할 때 필요한 매개값을 전달받기 위한 변수)
선언부 > 리턴타입 메소트명 (매개변수, .... )  {
실행할 코드를 작성하는 곳 ( 실행블록)
}
- 리턴 타입:  메소드 실행 후 호출한 곳으로 전달하는 결과값의 타입
- 메소드명 : 메소드명은 첫 문드를 소문자로 시작하고 , 캐멀 스타일로 작성
- 매개변수 : 메소드를 호출할 때 전달한 매개값을 받기 위해 사용
- 실행블로 : 메소드 호출 시 실행되는 부분

메소드 호출 
- 메소드 블록을 실제로 실행하는 것. 
- 클래스로부터 객체가 생성된 후에 메소드는 생성자와 다른 메소드 내부에서 
호출될 수 있고, 객체 외부에서도 호출될 수 있음
- 외부 객체에서 참조 변수와 도트(.) 연산자로 호출

가변길이 매개변수 
- 메소드가 가변길이 매개변수를 가지고 있다면 
매개변수의 개수와 상관없이 매개값을 줄 수 있음
int sum(int... values) {
}
- 메소드 호출 시 매개값을 쉼표로 구분해서 개수와 상관없이 제공할 수 있음
- 매개값들은 자동으로 배열 항목으로 변환되어 메소드에서 사용됨
int[] values = {1, 2, 3};
int result = sum(values);

int result = sum(new int[] {1, 2, 3} );

return 문
- 메소드의 실행을 강제 종료하고 호출한 곳으로 돌아간다는 의미
- 메소드 선언에 리턴 타입이 있을 경우에는 return 문 뒤에 리턴값을 추가로 지정해야함
- return 문 이후에 실행문을 작성하면 'Unreachable code'라는 컴파일 에러가 발생

메소드 오버로딩 ( 생성자 오버로딩과 개념이 같다, puls , 메소드 오버로딩의 선언에서는 리턴타입은 무관하다.) 
- 메소드 이름은 같으나 매게변수의 타입, 개수, 순서가 다른 메소드를 여러 개 선언하는 것
 
인스턴스 멤버

인스턴스 멤버 선언 및 사용
- 인스턴스 멤버: 필드와 메소드 등 객체에 소속된 멤버

this 키워드 
- 객체 내부에서는 인스턴스 멤버에 접근하기 위해 this를 사용. 
객체는 자신을 'this'라고 지칭
- 생성자와 메소드의 매개변수명이 인스턴스 멤버인 필드명과 동일한 경우, 
인스턴스 필드임을 강조하고자 할 때  this 를 주로 사용

정적 멤버
정적 멤버 선언 
- 정적멤버 : 메소드 영역의 클래스에 고정적으로 위치하는 멤버
- static 키워드를 추가해 정정 필드와 정적 메소드로 선언

정적 멤버 사용 
- 클래스가 메모리로 로딩되면 정적 멤버를 바로 사용할 수 있음. 
- 클래스 이름과 함께 도트(.) 연산자로 접근
- 정적 필드와 정정 메소드는 객체 참조 변수로도 접근 

정적 블록
- 정적 필드를 선언할 때 복잡한 초기화 작업이 필요한다면 정적 블록을 이용
static {
}
- 정적 블록은 클래스가 메모리로 로딩될 때 자동으로 실행
- 정적 블록이 클래스 내부에 여러 개가 선언되어 있을 경우에는 선언된 순서로 실행
- 정적 필드는 객체 생성 없이도 사용할 수 있기 때문에 
생성자에서 초기화 작업을 하지 않음

인스턴스 멤버 사용불가
- 정적 메소드와 정적 블록은 내부에 인스턴스 필드나 인스턴스 메소드를 사용할 수
없으며 this도 사용할 수 없음.
- 정적 메소드와 정적 블록에서 인스턴스 멤버를 사용하고 싶다면 
객체를 먼저 생성하고 참조 변수로 접근

final 필드와 상수
final 필드 선언
- final 필드는 초기값이 저장되면 최종적인 값이 되어서 프로그램 실행
도중에 수정할 수 없게 됨.
- filnal 필드에 초기값을 주려면 필드 선언 시에 
초기값을 대입하거나 생성자에서 초기값을 대입
final 타입 필드 [=초기값];

상수 선언 
  - 상수 : 불변의 값을 저장하는 필드 
- 상수는 객체마다 저장할 필요가 없고 , 
여러개의 값을 가져도 안 되기 때문에 static 이면서 final
static final 타입 상수 [=초기값];

패키지 
자바의 패키지 
- 클래스의 일부분이며, 클래스를 식별하는 용도
- 패키지는 주로 개발 회사의 도메인 이름의 역순으로 만듦
- 상위 패키지와 하위 패키지를 도드(.)로 구분 
- 패키지에 속한 바이트코드 파일 (~.class)은 따로 
떼어내어 다른 디렉토리로 이동할 수 없음. 


패키지 선언 
- 패키지 선언은 package 키워드와 함께 패키지 이름을 기술한 것.
항상 소스파일 최상단에 위치

package  상위패키지, 하위패키지;

public class 클래스명 {...}

- 패키지 이름은 모두 소문자로 작성. 패키지 이름이 서로 중복되지
않도록 회사 도메인 이름의 역순으로 작성하고, 마지막에는 프로젝트 이름을 붙여줌.. 

com.samsung.projectname
com.lg.projectname
org.apache.projectname

import 문 
- 다른 패키지에 있는 클래스를 사용하려면 import문을 이용해서 
어떤 패키지의 클래스를 사용하는지 명시 
- import 문은 패키지 선언과 크래스 선언 사이에 작성. 
import 키워드 뒤에는 사용하고자 하는 클래스의 전체 이름을 기술


접근 제한자 

접근제한자 
- 중요한 필드와 메소드가 외부로 노출되지 않도록 해 객체의 무결성을 
유지하기 위해서 접근 제한자 사용
- 접근 제한자는 public, protected, private의 세 가지 종류 

접근 제한자 제한 대상       제한 범위
public   클래스, 필드, 생성자, 메소드    없음
protected     필드, 생성자, 메소드 같은 패키지이거나, 자식객체만 사용가능
(default) 클래스, 필드, 생성자, 메소드 같은 패키지
provate 필드, 생성자, 메소드 객체 내부



클래스의 접근 제한 
- 클래스를 선언할 때 public 접근 제한자를 생략하면 클래스는 
다른 패키지에서 사용할 수 없음
- 클래스를 선언할 때 public 접근 제한자를 붙이면 클래스는 같은 패키지뿐만 아니라 
다른 패키지에서도 사용할 수 있음

생성자의 접근 제한 
- 생성자는 public, default, private 접근 제한을 가질 수 있음 

필드와 메소드의 접근제한
- 필드와 메소드는 public, default, private 접근 제한을 가질 수 있음 

Getter와 Setter 

Setter 
- 데이터를 검증해서 유효한 값만 필드에 저장하는 메소드 
Getter 
- 필드값이 객체 외부에서 사용하기에 부적절한 경우, 
적절한 값으로 변환해서 리턴할 수 있는 메소드  

싱글톤 패턴
- 생성자를 private 접근 제한해서 외부에서 new 연산자로 생성자를 
호출할 수 없도록 막아서 외부에서 마음대로 객체를 생성하지 못하게 함
- 대신 싱글톤 패턴이 제공하는 정적 메소드를 통해 
간접적으로 객체를 얻을 수 있음. 

728x90
반응형

댓글