객체 지향 프로그래밍 언어, 자바를 사용하는 이유

CO빈·2024년 12월 9일
0

백엔드

목록 보기
5/8
post-thumbnail

김영한의 실전 자바-기본편

메서드

  • 메서드 선언에서 이름, 변환타입, 매개변수(파라미터) 포함
  • 인수: 넘기는 값= 전달하는 수
  • 매개변수: string str, int age

매개변수가 없는 경우

  • 변환 타입이 없는 경우: void로 정의
    • return으로 반환, 생략 가능
    • 반환 타입이 있는 경우

⭐ 자바는 항상 변수의 값을 복사해서 대입한다.⭐️

메서드 오버로딩
: 같은 이름의 메서드를 여러개 정의했다.

  • 반환 타입은 인정하지 않는다.

클래스와 데이터

클래스 이름은 카멜케이스

클래스는 객체를 생성하기 위한 설계도이고, 이 설계도를 기반으로 실제 메모리에 만들어진 실체를 객체 또는 인스턴스라 한다.

객체vs인스턴스: 둘 다 클래스에서 나온 실체라는의미에서 비슷하게 사용되지만, 용어상 인스턴스는 객체보다 더 관계에 초점을 맞춘 단어이다.

기본형과 참조형

기본형을 제외한 나머지는 모두 참조형이다. 기본형은 소문자로 시작, 클래스는 대문자로 시작하며 모두 참조형이다.

참조형의 초기값은 null

String 은 사실 클래스다. 따라서 참조형이다. 그런데 기본형처럼 문자 값을 바로 대입할 수 있다.
nullpointerexception: null에 참조할 주소가 존재하지않는다.

객체지향 프로그래밍

절차지향프로그래밍은 데이터와 해당 데이터에 대한 처리 방식이 분리되어있다.

반면 객체 지향은 데이터와 그 데이터에 대한 행동이 하나의 ‘객체’안에 포함되어 있다.

절차지향 프로그래밍의 한계
: 데이터와 기능이 분리되어있다는 점=> 유지보수 관점에서도 관리 포인트가 2곳으로 늘어난다.

캡슐화
: 속성과 기능을 하나로 묶어서 필요한 기능을 메서드를 통해 외부에 제공하는 것
ex) 음악플레이어를 만들 경우: 사용하는 입장과 제공하는 입장을 분리한다. 제공하는 코드만 수정하면된다

생성자

생성자가 왜 필요한가?
: 객체의 상태를 안전하게 초기화하고, 코드 중복을 줄이며, 객체 지향 원칙을 잘 지키기 위해서는 생성자를 사용해야 한다.

this (자기자신 인스턴스 참조)
: 멤버 변수와 메서드 매개변수 이름이 같을때 둘을 구분함

생성자는 메서드와 비슷하지만,

  • 생성자 이름은 클래스 이름과 같아야한다.
  • 생성자는 반환 타입이 없다.

생성자 장점
객체를 생성할 때 직접 정의한 생성자가 있다면 직접 정의한 생성자를 반드시 호출해야한다는 점이다. 참고로 생성자를 메서드 오버로딩 처럼 여러개 정의할 수 있는데, 이 경우에는 하나만 호출하면 된다.
=> 아무 정보없는 유령 회원 정보를 원천 막을 수 있다.

생성자를 사용하면 필수값 입력을 보장할 수 있다.

접근 제어자

private: 모든 외부 호출을 막는다.
default: 같은 패키지안에서 호출은 허용한다.
protected: 같은 패키지안에서 호출은 허용한다. 패키지가 달라도 상속 관계의 호출은 허용한다.
public: 모든 외부 호출을 허용한다.

클래스 레벨의 접근 제어자 규칙

  • public, default만 사용할 수 있다.
  • 하나의 자바 파일에 public클래스는 하나만 등장할 수 있다.
  • 하나의 자바 파일에 default 접근 제어자를 사용하는 클래스는 무한정 만들 수 있다.

캡슐화
: 데이터와 해당 데이터를 처리하는 메서드를 하나로 묶어서 외부에서의 접근을 제헌하는 것을 말한다.

  • 데이터를 숨겨라
    : 객체에는 속성(데이터)과 기능(메서드)가 있다. 가장 필수로 속성을 숨겨야한다
  • 기능을 숨겨라
    : 외부에서 사용하지 않고, 내부에서만 사용하는 기능은 감추는 것이 좋다.

=> 접근 제어자와 캡슐화를 통해 데이터를안전하게 보호하는 것은 물론이고, 해당 기능을 사용하는 복잡도도 낮출 수 있다.

자바 메모리 구조와 static

  • 메서드 영역 : 클래스 정보를 보관한다. 이 클래스 정보가 붕어빵 틀이다.
    클래스 변수
    => 클래스 정보, static 영역, 런타임 상수

  • 스택 영역 : 실제 프로그램이 실행되는 영역이다. 메서드를 실행할 때 마다 하나씩 쌓인다, 지역변수

  • 힙 영역 : 객체(인스턴스)가 생성되는 영역이다. new 명령어를 사용하면 이 영역을 사용한다. 쉽게 말해 붕어빵 틀로부터 생성된 붕어빵이 존재하는 공간이다. 참고로 배열도 해당, 인스턴스 변수
    =>가비지 컬렉션이 이루어지는 주요 영역, 더 이상 참조되지 않는 객체는 제거된다.

  • static변수: 공용 변수를 사용해서 편리하게 문제를 해결할 수 있다. (=클래스 변수, 정적변수)

  • 변수와 생명 주기
    : 클래스 변수 > 인스턴스 변수 > 지역 변수

  • static 메서드
    클래스 내부 기능을 사용할 때,static이 붙은 정적 메서드나 정적 변수만 사용가능, 인스턴스 변수나 인스턴스 메서드 사용할 수 없다.
    여러번 호출할 때, import static을 선언하면 간편함

  • main()메서드
    객체 생성없이 바로 실행

final

: 변수에 final을 붙이면 더이상 변경할 수 없다는 뜻

생성자 초기화와 다르게 필드 초기화는 필드의 코드에 해당 값이 미리 정해져 있기때문에 모든 인스턴스가 같은 값을 사용하는 것은 결과적으로 메모리를 낭비하게 된다.
=> java에서 static final이 붙은 것을 상수라 함, 바뀌지 않는 공용 변수로 중복과 메모리 모두 해결 가능 (대문자 사용하고 _언더스코어 사용)

상속

기존 클래스의 필드와 메서드를 새로운 클래스에서 재사용하게 해준다.

  • 다중 상속을 허용하지 않는다.

⭐⭐⭐상속과 메모리 구조⭐⭐⭐
상속이라 해서 단순히 부모 필드와 메서드만물려받는게 아니라 부모 클래스도 함께 포함해서 생성해서 생성된다.
외부에서 볼때 하나의 인스턴스 생성같지만 내부에서는 부모와 자식 모두 생성되고 공간도 구분된다.

상속과 메서드 오버라이딩 @Override
: 부모의 기능을 재정의한다. 생략이 가능하나 어노테이션을 사용한다면 컴파일 오류를 잡아주며 코드의 명확성을 높여준다.

오버로딩 vs 오버라이딩

  • 메서드 오버로딩: 메서드 이름이 같고 매개변수가 다른 메서드를 여러개 정의하는 것
  • 메서드 오버라이딩: 하위클래스에서 상위클래스의 메서드를 재정의하는 과정, 상속 관계에서 사용

메서드 오버라이딩 조건

  • 오버라이딩 메서드의 접근제어자는 상위클래스의 메서드보다 더 제한적이면안된다.
  • 상위 클래스 메서드보다 더 많은 체크 예외를 throws로 선언할 수 없다.
  • static, final, private 이 붙은 것은 할 수 없다.
  • 생성자는 오버라이딩 할 수 없다.

this는 내꺼 참조 super는 부모에서 참조
super-생성자
상속 관계를 사용하면 자식 클래스의 생성자에서 부모 클래스의 생성자를 반드시 호출해야한다

0개의 댓글

관련 채용 정보