Troubleshooting
- 개인 과제를 하면서 문제가 발생하였다.
Java : non-static method calculate(double,double,char) cannot be referenced from a static context
무엇이 문제일까?
- Static으로 선언된 메소드에서는 Static으로 선언되지 않은(Non-static) 메소드를 불러오지 못합니다.
Non-static 메소드는 특정 클래스의 객체가 생성될 때 만들어지고, 해당 객체 내에서만 사용될 수 있습니다.
Static 메소드와 Non-static 메소드는 다른 메모리 영역에 생성되어 동작합니다. Static 메소드는 정적 데이터 영역에서 생성되고
Non-static 메소드는 스택에 생성됩니다. 정적 데이터 영역에 만들어진 메소드는 프로그램 시작 시 만들어지고 종료할 때 까지
사용할 수 있습니다. 반면에 Non-Static 메소드는 객체가 생성될 때 같이 생성되고 객체가 소멸할 때 같이 소멸합니다.
때문에 Static 메소드는 먼저 컴파일 되고 Non-Static 메소드는 정의되지 않기 때문에 참조를 하지 못합니다.
알고보니 단순..?
Non-static 메소드에 static을 붙여주거나
반대로 static 메소드에서 static을 빼주면 됩니다.
하지만 static을 붙여주므로써 몇 가지 기능이 제한될 수 있기 때문에 잘 선택해야 한다.
하면서
이게 뭐지 하고 보면서 천천히 문제가 발생한 이유를 보니 내가 실수했구나 라는 생각이 확 들었다 하지만
천천천히 문제를 해결해보고 검색도 해보고 하니 이번에 발생한 문제는 생각보다 너무 어이가 없었다.
다음에는 조금 더 꼼꼼히 봐야겠다.
-------------------------------------------------------------------------------------------------------------------
복습 내용
인스턴스 멤버와 클래스 멤버
멤버 = 필드 + 변수
- 인스턴스 멤버 = 인스턴스 필드 + 인스턴스 메서드
- 클래스 멤버 = 클래스 필드 + 클래스 메서드
인스턴스 멤버 & 클래스 멤버
- 필드와 메서드는 선언하는 방법에 따라서 인스턴스 멤버와 클래스 멤버로 구분할 수 있다.
- 인스턴스 멤버는 객체 생성 후에 사용할 수 있고 클래스 멤버는 객체 생성 없이도 사용할 수 있다
- 인스턴스 멤버
- 인스턴스 멤버란 New를 통해 객체를 생성한 후 사용할 수 있는 필드와 메서드를 말한다.
- 클래스 멤버
- 클래스는 Java의 클래스 로더에 의해 메서드 영역에 저장되고 사용된다
- 클래스 멤버란 메서드 영역의 클래스와 같은 위치에 고정적으로 위치하고 있는 멤버를 의미
- 클래스 멤버는 객체의 생성 필요 없이 바로 사용 가능.
- 클래스 멤버 선언
- 필드와 메서드를 클래스 멤버로 만들기 위해서는 static 키워드를 사용하면 된다!
- 일반적으로 인스턴스마다 모두 가지고 있을 필요 없는 공용적인 데이터를 저장하는 필드는
클래스 멤버로 선언하는 것이 좋다! - 인스턴스 필드를 사용하지 않고 실행되는 메서드가 존재한다면 static 키워드를 사용하여
클래스 메서드로 선언하는 것이 좋다!
- 일반적으로 인스턴스마다 모두 가지고 있을 필요 없는 공용적인 데이터를 저장하는 필드는
- 필드와 메서드를 클래스 멤버로 만들기 위해서는 static 키워드를 사용하면 된다!
- 클래스는 Java의 클래스 로더에 의해 메서드 영역에 저장되고 사용된다
주의
-클래스 멤버로 선언된 메서드는 인스턴스 멤버를 사용 불가
- 반대로 인스턴스 멤버로 선언된 메서드는 클래스 멤버를 사용할 수 있다.
- 클래스 멤버는 객체 생성 없이 바로 사용 가능하기 때문에 객체가 생성되어야 존재할 수 있는 인스턴스 멤버를 사용할 수 없다.
- 지역변수
- 메서드 내부에 선언한 변수를 의미
- 메서드가 실행될 때마다 독립적인 저장하고 관리하게 됩니다
- 지역 변수는 메서드 내부에서 정의될 때 생성되어 메서드가 종료될 때까지만 유지됩니다
- Final 필드와 상수
- final은 '최종적' 이라는 의미이다
- final 필드는 초기값이 저장되면 해당 값을 프로그램이 실행하는 도중에는 절대로 수정할 수 없다.
- 또한 final 필드는 반드시 초기값을 지정해야 한다.
- final은 '최종적' 이라는 의미이다
- 상수
- 상수의 특징은 값이 반드시 한 개이며 불변의 값을 의미
- 인스턴스마다 상수를 저장할 필요가 없다.
- final 앞에 static 키워드를 추가하여 모든 인스턴스가 공유할 수 있는 값이 한개이며 불변인 상수를 선언 할 수 있다.
- 사용방법은 일반적인 클래스 필드와 동일하다. 하지만 수정은 불가능\
- 일반적으로는 상수는 대문자로 관리하는 것이 관례
생성자
생성자는 객체가 생성될 때 호출되며 객체르 초기화 하는 역할을 수행한다.
- 생성자의 선언과 호출
- 생성자는 반환 타입이 없고 이름은 클래스의 이름과 동일하다.
- new 연선자에 의해 객체가 생성되면서 생성자를 호출한다
- 기본 생성자
- 기본 생성자는 선언할 때 괄호() 안에 아무것도 넣지 않는 생성자를 의미
- 모든 클래스는 반드시 생성자가 하나 이상 존재
- 클래스에 생성자를 하나도 선언하지 않았다면 컴파일러는 기본 생성자를 바이트코드 파일에 자동으로 추가
따라서 이러한 경우는 기본 생성자 생략이 가능 - 반대로 단 하나라도 생성자가 선언되어 있다면 컴파일러는 기본 생성자를 추가하지 않는다.
- 컴파일러에 의해 생성되는 기본 생성자는 해당 클래스의 접근 제어자를 따른다.
- 필드 초기화와 생성자 오버로딩
- 필드 초기화
- 생성자는 객체를 초기화하는 역할을 수행한다.
- 객체를 만들 때 인스턴스마다 다른 값을 가져야 한다면 생성자를 통해서 필드를 초기화할 수 있따
- 반대로 인스턴스마다 동일한 데이터를 가지는 필드는 초기값을 대입하는 것이 좋다.
- 생성자 오버로딩
- 생성자를 통해 필드를 초기화할 때 오버로딩을 적용할 수있다.
- 필드 초기화
주의
- 오버로딩을 할 때 개수, 타입, 순서가 동일한데 매개변수명만 다르게 하는 경우 오버로딩 규칙에 위배되기 때문에 오류가 발생!
this 와 this()
- this
- this는 객체 즉. 인스턴스 자신을 표현하는 키워드입니다.
- 객체 내부 생성자 및 메서드에서 객체 내부 멤버에 접근하기 위해 사용될 수 있다,
- 객체 내무 멤버에 접근할 때 this 키워드가 필수는 아니지만 상황에 따라 필수가 될 수 있다.
- 또한 this는 인스턴스 자신을 뜻하기 때문에 객체의 메서드에서 리턴 타입이 인스턴스 자신의 클래스 타입이라면
this를 사용하여 인스턴스 자신의 주소를 반환할 수도 있다.
- this()
- this()는 객체 즉, 인스턴스 자신의 생성자를 호출하는 키워드
- 객체 내부 생성자 및 메서드에서 해당 객체의 생성자를 호출하기 위해 사용될 수 있다.
- 생성자를 통해 객체의 필드를 초기화할 때 중복되는 코드를 줄여줄 수있다.
주의
this() 키워드를 사용해서 다른 생성자를 호출할 때는 반드시 해당 생성자의 첫 줄에 작성되어야 한다.
접근 제어자
접근 제어자는 클래스, 변수, 메서드의 선언부에 사용되어 부가적인 의미를 부여해 준다
- 접근 제어자 : public, protected, default, private
- 그 외 제어자 : static, final, abstarct
하나의 대상에 여러 개의 제어자를 조합해서 사용할 수 있으나, 접근 제어자는 단 하나만 사용 가능
- 사용 가능한 접근 제어자
- 클래스 : public , default
- 메서드 & 멤버 변수 : public, proteced, default, private
- 지역 변수 : 없음
- 접근 제어자를 이용한 캡슐화(은닉성)
- 접근제어자는 클래스 내부에 선언된 데이터를 보호하지 위해서 사용
- 유효한 값을 유지하도록, 함부로 변경하지 못하도록 접근을 제한하는 것이 필요
- 생성자의 접근 제어자
- 생성자에 접근 제어자를 사용함으로 인스턴스의 생성을 제한할 수 있다
- 일반적으로 생성자의 접근 제어자는 클래스의 접근 제어자와 일치
- Getter 와 Setter
- 객체의 무결성 즉, 변경이 없는 상태를 유지하기 위해 접근 제어자를 사용
- 이때 외부에서 필드에 직접 접근하는 것을 막기 위해 필드에 private, default 등의 접근 제어자를 사용
- Getter
- 외부 객체의 private 한 필드를 읽을 필요가 있을 때 Getter 메서드를 사용
- 메서드 이름의 규칙은 get + 필드 이름(첫 글자 대문자)
- 사용하는 방법은 인스턴스 메서드 호출과 동일
- Setter
- 외부에서 객체의 private 한 필드를 저장/ 수정할 필요가 있을 때 Setter 메서드를 사용
- 메서드 이름의 규칙은 : set + 필드 이름(첫 글자 대문자)
- 사용하는 방법은 인스턴스 메서드 호출과 동일
- 제어자의 조합
- 사용 가능한 제어자
- 클래스 : public, default. final, abstarct
- 메서드 : public, protected, daefault, private, final, abstarct , staic
- 멤버 변수 : public, protected, dafault, private, final, static
- 지역 변수 : final
- 사용 가능한 제어자
- 객체의 무결성 즉, 변경이 없는 상태를 유지하기 위해 접근 제어자를 사용
제어자 사용 시 주의사항
- 메서드에 static과 abstract를 함께 사용할 수 없다
- 클래스에 abstarct 와 fianl을 동시에 사용할 수 없다
- abstarct 메서드의 접근 제어자가 private 일 수 없다
- 메서드에 private 와 final을 같이 사용할 필요는 없다.
package와 import
- 패키지란?
- 패키지란 클래스의 일부분이면서 클래스를 식별해 주는 용도
- 패키지는 상위 패키지와 하위 패키지를 도트(.)로 구분한다
- package 상위 패키지.하위 패키지; 이렇게 선언할 수 있다.
- 패키지란 클래스의 일부분이면서 클래스를 식별해 주는 용도
- import란?
- import는 다른 패키지에 있는 클래스를 사용하기 위해 명시하는 키워드
'자바' 카테고리의 다른 글
[TIL] 2024.08.13 [Java/Spring] (0) | 2024.08.13 |
---|---|
[TIL] Java 2024.08.12 (0) | 2024.08.12 |
[TIL] 내일배움캠프 웹개발 백엔드 과정 2024.07.26 김현수 (0) | 2024.07.26 |
[TIL] 내일배움캠프 웹개발 백엔드 과정 2024.07.25 김현수 (0) | 2024.07.25 |
[TIL] 내일배움캠프 웹개발 백엔드 과정 2024. 07.23 김현수 (2) | 2024.07.23 |