2023년 1월 1일
08:00 AM
Buffering ...

최근 글 👑

[TIL] 내일배움캠프 웹개발 백엔드 과정 2024.07.29 김현수

2024. 7. 29. 21:09ㆍ자바

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 키워드를 사용하여
          클래스 메서드로 선언하는 것이 좋다!
주의
-클래스 멤버로 선언된 메서드는 인스턴스 멤버를 사용 불가
- 반대로 인스턴스 멤버로 선언된 메서드는 클래스 멤버를 사용할 수 있다.
- 클래스 멤버는 객체 생성 없이 바로 사용 가능하기 때문에 객체가 생성되어야 존재할 수 있는 인스턴스 멤버를 사용할 수 없다.

 

  • 지역변수
    • 메서드 내부에 선언한 변수를 의미
    • 메서드가 실행될 때마다 독립적인 저장하고 관리하게 됩니다
    • 지역 변수는 메서드 내부에서 정의될 때 생성되어 메서드가 종료될 때까지만 유지됩니다
  • 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는 다른 패키지에 있는 클래스를 사용하기 위해 명시하는 키워드