매개변수가 없는 경우
⭐ 자바는 항상 변수의 값을 복사해서 대입한다.⭐️
메서드 오버로딩
: 같은 이름의 메서드를 여러개 정의했다.
클래스 이름은 카멜케이스
클래스는 객체를 생성하기 위한 설계도이고, 이 설계도를 기반으로 실제 메모리에 만들어진 실체를 객체 또는 인스턴스라 한다.
객체vs인스턴스: 둘 다 클래스에서 나온 실체라는의미에서 비슷하게 사용되지만, 용어상 인스턴스는 객체보다 더 관계에 초점을 맞춘 단어이다.
기본형을 제외한 나머지는 모두 참조형이다. 기본형은 소문자로 시작, 클래스는 대문자로 시작하며 모두 참조형이다.
참조형의 초기값은 null
String 은 사실 클래스다. 따라서 참조형이다. 그런데 기본형처럼 문자 값을 바로 대입할 수 있다.
nullpointerexception: null에 참조할 주소가 존재하지않는다.
절차지향프로그래밍은 데이터와 해당 데이터에 대한 처리 방식이 분리되어있다.
반면 객체 지향은 데이터와 그 데이터에 대한 행동이 하나의 ‘객체’안에 포함되어 있다.
절차지향 프로그래밍의 한계
: 데이터와 기능이 분리되어있다는 점=> 유지보수 관점에서도 관리 포인트가 2곳으로 늘어난다.
캡슐화
: 속성과 기능을 하나로 묶어서 필요한 기능을 메서드를 통해 외부에 제공하는 것
ex) 음악플레이어를 만들 경우: 사용하는 입장과 제공하는 입장을 분리한다. 제공하는 코드만 수정하면된다
생성자가 왜 필요한가?
: 객체의 상태를 안전하게 초기화하고, 코드 중복을 줄이며, 객체 지향 원칙을 잘 지키기 위해서는 생성자를 사용해야 한다.
this (자기자신 인스턴스 참조)
: 멤버 변수와 메서드 매개변수 이름이 같을때 둘을 구분함
생성자는 메서드와 비슷하지만,
생성자 장점
객체를 생성할 때 직접 정의한 생성자가 있다면 직접 정의한 생성자를 반드시 호출해야한다는 점이다. 참고로 생성자를 메서드 오버로딩 처럼 여러개 정의할 수 있는데, 이 경우에는 하나만 호출하면 된다.
=> 아무 정보없는 유령 회원 정보를 원천 막을 수 있다.
생성자를 사용하면 필수값 입력을 보장할 수 있다.
private: 모든 외부 호출을 막는다.
default: 같은 패키지안에서 호출은 허용한다.
protected: 같은 패키지안에서 호출은 허용한다. 패키지가 달라도 상속 관계의 호출은 허용한다.
public: 모든 외부 호출을 허용한다.
클래스 레벨의 접근 제어자 규칙
캡슐화
: 데이터와 해당 데이터를 처리하는 메서드를 하나로 묶어서 외부에서의 접근을 제헌하는 것을 말한다.
=> 접근 제어자와 캡슐화를 통해 데이터를안전하게 보호하는 것은 물론이고, 해당 기능을 사용하는 복잡도도 낮출 수 있다.
메서드 영역 : 클래스 정보를 보관한다. 이 클래스 정보가 붕어빵 틀이다.
클래스 변수
=> 클래스 정보, static 영역, 런타임 상수
스택 영역 : 실제 프로그램이 실행되는 영역이다. 메서드를 실행할 때 마다 하나씩 쌓인다, 지역변수
힙 영역 : 객체(인스턴스)가 생성되는 영역이다. new 명령어를 사용하면 이 영역을 사용한다. 쉽게 말해 붕어빵 틀로부터 생성된 붕어빵이 존재하는 공간이다. 참고로 배열도 해당, 인스턴스 변수
=>가비지 컬렉션이 이루어지는 주요 영역, 더 이상 참조되지 않는 객체는 제거된다.
static변수: 공용 변수를 사용해서 편리하게 문제를 해결할 수 있다. (=클래스 변수, 정적변수)
변수와 생명 주기
: 클래스 변수 > 인스턴스 변수 > 지역 변수
static 메서드
클래스 내부 기능을 사용할 때,static이 붙은 정적 메서드나 정적 변수만 사용가능, 인스턴스 변수나 인스턴스 메서드 사용할 수 없다.
여러번 호출할 때, import static을 선언하면 간편함
main()메서드
객체 생성없이 바로 실행
: 변수에 final을 붙이면 더이상 변경할 수 없다는 뜻
생성자 초기화와 다르게 필드 초기화는 필드의 코드에 해당 값이 미리 정해져 있기때문에 모든 인스턴스가 같은 값을 사용하는 것은 결과적으로 메모리를 낭비하게 된다.
=> java에서 static final이 붙은 것을 상수라 함, 바뀌지 않는 공용 변수로 중복과 메모리 모두 해결 가능 (대문자 사용하고 _언더스코어 사용)
기존 클래스의 필드와 메서드를 새로운 클래스에서 재사용하게 해준다.
⭐⭐⭐상속과 메모리 구조⭐⭐⭐
상속이라 해서 단순히 부모 필드와 메서드만물려받는게 아니라 부모 클래스도 함께 포함해서 생성해서 생성된다.
외부에서 볼때 하나의 인스턴스 생성같지만 내부에서는 부모와 자식 모두 생성되고 공간도 구분된다.
상속과 메서드 오버라이딩 @Override
: 부모의 기능을 재정의한다. 생략이 가능하나 어노테이션을 사용한다면 컴파일 오류를 잡아주며 코드의 명확성을 높여준다.
this는 내꺼 참조 super는 부모에서 참조
super-생성자
상속 관계를 사용하면 자식 클래스의 생성자에서 부모 클래스의 생성자를 반드시 호출해야한다