Backend/Java

[java]객체 문법, 기본 자료형, 상속성, 은닉성

해로몬 2024. 10. 17. 16:41

1. 자료형

  • 자료형
자료형
문자 char
숫자 정수형 byte, short, int, long
실수형 float, double
논리 boolean
  • 변수/상수
    • 변수(variable) : 한 번 데이터 넣고 다음에 바꿀 수 있는 저장소
    • 상수(constant) : 한번 데이터를 넣고 다음에 바꿀 수 없는 저장소
  • 형 변환(Casting)
    • 자동 형변환(Implicit Casting) : 작은 데이터 타입 -> 큰 데이터 타입 변환될 때 자동으로 이루어짐. *데이터 손실 발생 X
      • ex)int -> double
    • 강제 형변환(Explicit Casting) : 큰 데이터 타입 -> 작은 데이터 타입으로 변환할 때 사용 *데이터 손실이 발생할 수 있기 때문에 명시적으로 반환해야함. '명시적 형변환'이라고도 함.
      • ex)double -> int
short a =10;
short b =15;

//산술 연산을 위한 기본 자료형 => int 이상
short sum = a + b //에러발생
int sum2 = a + b //정상작동
int sum = (short)(a + b);//강제형 변환
  • 연산자
산술 연산자 + - * / %
"1"+"1" : 문자열 연결
1 + 1 : 산술 연산
대입 연산자 할당 연산 =
복합 대입연산자 산술 연산자 + 대입 연산자
예시 ) a = a + 10
증감 연산자 전위 ++a
후위 a++
비교 연산자 >, <, >=, <=, ==, =! (결과값 : true, false)
논리합 연산자(이항 연산자) && : 둘 중 모두가 참이면 참 (true && true => true)
|| : 둘 중 하나가 참이면 참(예시, ture||flase => true)
삼항 연산자 a ? True : False 
ex)int a = 10
a =10 ? 100 : 150
비트 연산자 &, |, ^, <<, >>

 

 

2. 제어

  • 조건에 의한 분기
    • if
    • switch
    • 삼항 연산자
  • 조건에 의한 반복
    • for
    • while
    • do - while 
    • 기타
      • continue
      • break
  • 중첩효과
    • 프로그램 흐름
    • 제어
    • 알고리즘
  • 기본자료형
  • 참조 자료형
    • 참조(객체)변수
    • 배열
    • 객체
  •  

스택(Stack) : 메서드 호출 시 지역변수나 참조 변수를 저장하는 고정된 크기의 메모리 영역. LIFO 방식으로 할당 및 해제.

힙(Heap) : 동적으로 생성된 객체나 배열이 저장되는 메모리 영역. 크기가 유연하며, 가비지 컬렉터에 의해 자동관리.

+)참조 변수는 스택 객체는 힙에 저장되는 방식을 상호작용함.

  스택
역할 메서드 호출 시 생성되는지역변수, 참조변수 저장 동적으로 생성된 객체, 배열 저장
메모리 관리 방식 LIFO 방식 new로 할당, 가비지 컬렉터가 관리
저장되는 데이터 기본자료형 변수, 참조변수 객체, 배열(동적 할당된 데이터)
메모리 해제 메서드가 종료되면 자동으로 해제 가비지 컬렉터에 의해 사용되지 않는 객체 해제
속도 매우 빠름 상대적으로 느림
메모리 크기 작음
접근 범위 메서드 스코프 내에서만 접근가능 프로그램 내 전역적으로 접근 가능

 

3.객체 문법

  • 순차적 / 비구조적 프로그래밍 : 하나의 함수나 코드 몸체에 연속된 코드를 작성하는 프로그래밍 패러다임
  • 절차적 / 구조적 프로그래밍 : 흐름을 어지럽히는 흐름제어를 사용하지 않음으로 써 가독성을 높임.

[오버로딩]

하나의 클래스 안에서 사용되는 모든 식별자는 이름이 중복되면 안됨.

오버로딩 메소드 및 생성자를 작성하기 위한 규칙

  1. 메소드 및 생성자 이름이 같아야함.
  2. 인자 리스트는 반드시 달라야함(인자 개수, 인자 타입, 인자 순서)
  3. 리턴타입은 달라도 무관

[static]

객체는 클래스에서 생성, 클래스 하나엥서 무한대로 객체를 생성할 수 있고 그러한 객체는 모야은 동일할지 모르지만, 전혀 다른 덩어리이다.

하지만 static이 붙은 변수는 객체 변수가 아닌 클래스 변수로써 객체가 생성되기 전에 이미 다른 존재임.

 

[this]

객체 자신을 가르키는 레퍼런스 변수

 

[생성자]

인스턴스 변수를 초기화하는 역할

리턴 타입이 없고 반드시 클래스 명으로 생성자 이름을 지정함.

 

객체

  • 이종 기본자료형 모여 새로운 자료형
  • *새로운 자료형의 필요
  • 공통 정의 객체     ➡️  class
    • 속성 -> 멤버필드.     /변수.  (인스턴스 / 클래스)
    • 기능 -> 메서드       /함수  (인스턴스 / 클래스)
  •  ➡️인스턴스화(변수화) ➡️(객체, 참조)변수 👉  new와 .(dot) 사용
  •  ➡️추상화
  •  ➡️UML - diagram
  1. 클래스 선언 : class 클래스명
    • 이름 규칙 : 대문자로 시작
  2. 멤버 필드 선언
    • 인스턴스 : 자료형 변수명
    • 클래스 : static 자료형 변수명
      • 이름 규칙 : 소문자(명사)로 시작
  3. 메서드 선언
    1. 인스턴스
    2. 클래스 : static
    3. 이름 규칙 - 소문자(동사)로 시작 
      • 오버로딩(중복 정의) : 같은 메서드 명을 선언(아규먼트가 다름)
      • 가변인자 (Varargs)

this()

  • 같은 클래스의 다른 생성자를 호출할 때 사용되며, 코드 중복을 줄이고 생성자 간의 공통로직을 관리하는 데 유용함.
  • 생성자 내부에서만 사용 가능
  • <주의 사항>
    • 첫 번째 문장 : 생성자 내에서 반드시 첫번째 문장으로 사용되어야 함. ->컴파일 에러가 발생할 수도 있음.
    • 자기 호출 불가 : 자기 자신을 호출하거나, 순환 참조를 만들 수 없음.

 

 


[식별자 규칙 정리]

  1. 자바 클래스명 규칙:
    -클래스명은 대문자로 시작: 자바 클래스의 이름은 반드시 대문자로 시작
    예: Person, Employee, Car
    -파스칼케이스 사용: 클래스명에 두 개 이상의 단어가 포함될 때는 단어의 첫 글자를 대문자로 표기하는 파스칼케이스(PascalCase) 방식으로 작성.
    예: StudentRecord, BankAccount, CustomerInfo
    -예약어 사용 금지: 자바의 예약어(Reserved Keywords)는 클래스 이름으로 사용할 수 없음. 예를 들어, class, int, public 같은 단어는 사용할 수 없음.
    -특수문자 사용 금지: 숫자나 언더스코어(_) 외에 특수문자는 클래스명에 사용할 수 없음.
    예: MyClass_1 (허용됨), My-Class (허용되지 않음)
    -숫자는 첫 글자에 사용 금지
    -클래스명은 의미 있게: 클래스 이름은 클래스가 나타내는 개념이나 역할을 명확하게 설명할 수 있도록 의미 있는 이름으로 지어야 함.
    -파일명과 클래스명 일치
  2. 상수명 규칙 :
    -대문자 사용: 상수(constant)는 모두 대문자로 작성하며, 각 단어는 언더스코어(_)로 구분
    예: MAX_SPEED, PI, DEFAULT_TIMEOUT
    -의미 있는 이름: 상수는 고정된 값이나 불변의 의미를 전달해야 하므로, 이름이 명확하고 구체적이어야 함.
    예: MAX_USERS, MIN_AGE_LIMIT
  3. 메소드명 규칙 :
    -카멜케이스 사용: 메소드명은 소문자로 시작하며, 여러 단어가 결합될 때는 카멜케이스를 사용
    예: calculateTotal, getUserName, setAge
    -동사로 시작
    -의미 있는 이름: 메소드명은 메소드가 하는 일을 명확히 나타내야 함.
     -오버로딩 : 같은 메서드명을 선언하고, 매개변수가 달라야 함.

[변수의 사용 영역(scope)]

  • 클래스 변수 (Class Variable)
       - `static` 키워드로 선언된 변수.
       - 클래스가 메모리에 로드될 때 생성되며, 모든 인스턴스가 공유.
       - 클래스 이름으로 직접 접근 가능하며, 접근 제한자에 따라 외부 접근 가능 여부가 달라짐.
  • 인스턴스 변수 (Instance Variable)
       - 클래스 내에서 선언되지만 `static` 키워드가 없는 변수.
       - 각 인스턴스마다 독립적으로 생성되며, 인스턴스가 있어야 접근 가능.
  • 지역 변수 (Local Variable)
       - 메소드나 블록 내에서 선언된 변수.
       - 해당 메소드나 블록 내에서만 사용 가능하며, 메소드가 종료되면 사라짐.
  • 매개변수 (Parameter Variable)
       - 메소드에 전달된 인자를 받는 변수.
       - 해당 메소드 내에서만 사용 가능.
  • 블록 내 변수 (Block Variable)
       - 제어문(if, for, while 등) 안에서 선언된 변수.
       - 해당 블록 내에서만 유효하며, 블록이 끝나면 사라짐.

 

[상속과 오버라이딩 개념 정리]

  • 상속(Inheritance)
    • 상속은 자바에서 기존 클래스(부모)의 기능을 새로운 클래스(자식)가 물려받아 사용할 수 있게 하는 기능.
    • 상속을 통해 코드의 재사용성을 높이고, 유지보수성을 향상시킬 수 있음.
class 부모클래스 {
    // 부모 클래스 멤버(필드, 메소드 등)
}

class 자식클래스 extends 부모클래스 {
    // 자식 클래스 멤버(필드, 메소드 등)
}

 

부모클래스 : 공통적인 속성이나 동작을 정의한 클래스

자식 클래스 : 부모 클래스를 상속받아, 부모 클래스의 속성과 동작을 물려받음.

 

  • 오버라이딩(Overriding)
    • 오버라이딩은 자식 클래스가 부모클래스를 재정의하는 기능
    • 부모 클래스에서 제공한 메소드를 자식 클래스에서 다시 구현하여, 자식 클래스에 맞는 동작을 수행
    • <기본 문법>
      • 부모클래스의 메소드 이름, 반환타입, 매개변수가 동일해야 함.
      • 오버라이딩된 메소드는 자식 클래스에서 부모 클래스의 메소드를 덮어씀.
@Override  // 오버라이딩임을 명시 (선택사항)
public void 메소드이름() {
    // 재정의된 메소드 내용
}
  • 'super' 키워드 
    • 부모클래스의 멤버에 접근하기 위해 사용되는 특별한 키워드
    • super() 생략 가능 : 자식 클래스에서 생성자를 정의할 때 부모 클래스의 기본생성자를 호출하는 super()는 생략 가능. 그러나 부모클래스에 기본 생성자가 없거나, 매개변수가 있는 생성자를 호출해야 하는 경우에는 반드시 명시적으로 super()를 사용해야함.

<this와 super의 차이점>

키워드  
this 같은 클래스의 필드나 메소드를 참조할 때 사용
super 부모 클래스의 필드나 메소드를 참조할 때 사용
this() 같은 클래스의 다른 생성자를 호출할 때 사용
super() 부모 클래스의 생성자를 호출할 때 사용

 

  • final
    • 변수를 선언  ➡️ 변수는 한번만 값을 할당할 수 있음. 한 번 값이 할당되면 변경 불가능.
    • final 변수
      • 값을 한번만 할당할 수 있는 상수를 선언할때 사용
      • 기본 타입의 경우 값 변경 불가능
      • 참조 타입의 경우 참조하는 객체 변경 불가능, 객체의 내부 상태는 변경 가능
    • final 메서드
      • 오버라이딩 ❌
      • 하위 클래스에서 해당 메서드를 재정의 ❌
    • final 클래스
      • 상속❌
      • 다른 클래스가 이 클래스를 확장❌
    • 상수 static final
      • 클래스 상수를 정의할 때 사용
public static final int MAX_VALUE = 100;  // 클래스 상수

 

[접근 제어자의 종류와 특징]

접근 제어자 같은 클래스 같은 패키지 자식 클래스 전체 접근(외부)
private O X X X
(기본) O O X X
protected O O O X
public O O O O
  • ⭐️private 
    • 클래스 내부에서만 접근 가능. 다른 클래스나 외부에서 접근할 수 없음.
    • 주로 캡슐화의 핵심으로, 필드나 메소드를 외부에서 감추고 내부에서만 사용하도록 할 때 사용함.
  • ⭐️public : 
    • 어디서든지 접근이 가능함.
    • 클래스나 메소드가 공용 API로 사용될 때 주로 사용함.

캡슐화(Encapsulation)

캡슐화는 객체지향프로그래밍의 핵심 개념 중 하나, 데이터와 메소드를 하나의 단위(클래스)로 묶고, 데이터를 보호하는 것을 의미함.

캡슐화를 통해 클래스의 내부 상태는 외부에서 직접 접근하지 못하게 감추고, 오직 필요한 메소드를 통해서만 접근하도록 제한함.

=> 객체의 일관성을 유지하고, 불필요한 데이터 노출을 방지 할 수 있음.

<주요 목표>

  1. 내부 구현 감추기
  2. 데이터 보호 : 외부에서 데이터 수정 ❌  -> 객체의 상태를 안전하게 보호하고 유지
  3. 유효성 검증 : 메소드를 통해 데이털르 수정할 때, 필요한 유효성 검증을 추가할 수 있어, 데이터의 무결성을 유지할 수 있음.

<구현 방법>

  • private 필드
  • Getter와 Setter 메소드 : 데이터를 외부에서 접근하거나 수정할 때는 get과 set 메소드를 사용하며, 이를 통해 간접적으로 객체의 상태를 제어함.
    • Getter
      • private 필드에 저장된 데이터를 외부에서 조회할 수 있도록 하는 public 메소드
      • 필드를 직접 노출하지 않고, 안전하게 데이터에 접근할 수 있는 방법을 제공함.
    • Setter
      • private 필드의 값을 변경할 수 있도록 하는 public 메소드
      • 필드를 직접 수정하는 대신, 메소드를 통해 간접적으로 값을 설정하며, 유효성 검사를 추가하여 잘못된 값이 입력되지 않도록 함.