[JAVA] 클래스

msung99·2022년 3월 31일
0
post-thumbnail

static 멤버

static 멤버: 객체 내부에 존재하지 않고 메소드영역에 생성

  • 객체를 생성하지 않고도 존재하며 클래스 이름으로 바로 사용 가능하다

클래스객체 : 참조변수는 스택에 생성, 실제 객체는 힙에 생성

Calcular.pi 이렇게  static 멤버사용

static 블록


static 메소드

  • 블록 내부에 해당 클래스의 인스턴스 필드나 인스턴스 메소드 사용 불가

  • 일반 인스턴스 필드와 메소드는 반드시 객체를 만들어야지 사용가능.

  • 당연히 객체 자신의 참조인 this 도 사용불가능


  • non-static = 인스턴스 멤버

    • 객체마다 독립적으로 별도로 존재함
    • 객체 생성 후에 사용 가능함
  • static

    • 해당 클래스로부터 생성된 모든 객체가 공유하는 놈
    • 클래스당 하나만 생성됨
    • 클래스 멤버라고도 부름
    • 객체 만들지 않고도 사용가능

=> static 메소드는 non-static 멤버를 사용할 수 없다.
반대로 ,non-stati 메소드는 static 멤버 사용 가능


static vs 전역

static 이 전역변수 처럼 보일 수 있지만 다른 것이다.

지역변수 : 범위가 제한적 / 생명력이 한시적
전역변수 : 범위에 제한x / 생명력이 영생임(계속 살아있음)

  • 전역변수는 가급적 사용하지 말것(어디에서나 접근할 수 있기때문) 그러나 값이 유지된다는 점은 큰 장점임.

  • staic : 전역변수 처럼 값을 유지할수 있는 장점만 가져온 것, 그리고 로컬에서만 안전하게 접근 가능한 특성

  • 모든 필드와 메소드가 public static 으로 선언 :


예제분석

예제 17

  • main 메소드와 같이 static 메소드는 non-static 멤버(인스턴스 멤버)를 사용할 수 없다.

해결법1 : run(), speed 를 모두 static 으로 만든다.
해결법2 : 코드에서 처럼 main 메소드 안에 객체를 생성해서 static 멤버에 접근


final

  • final 필드 : 말그대로 최종, 끝. 가져자 사용하는 것은 가능해도 값을 변경하는 것은 불가능 (상수와 같은 개념)

    • 예외적으로 생성자 내에서 초기화 1번은 가능하다.
    • 그 뒤로 절대 값을 변경하지 못함!!
  • static final : 객체 내부에 존재하지 않고, 모든 객체가 공유해서 사용하는 고유한 값(변경 불가능하며 공유 가능한 값이다)

public class Person{
  final String nation = "Korea";
  
  Person()
  {
 
}

패키지(package)

  • 클래스를 기능별로 묶어서 그룹 이름을 붙여 놓은 것 (어떤 한 기능 단위의 분류)

  • 폴더와 비슷한 개념. 하나의 목적을 가진 애들을 폴더에 넣듯이.

  • 컴파일러가 클래스를 인식시 => 상위패키지.하위패키지.클래스
    이렇게 패키지 경로까지 쭉 붙여줘서 상세하게 인식한다
    (그냥 클래스 이름만 붙여주면 중복되는 이름을 가진 클래스가 등장해서 충돌이 발생할 수도 있기 때문에 이렇게 인식)


import문

  • 다른 패키지에 있는 클래스를 내가 가져다 사용하고 싶을 때 사용

  • 별표 * 는 이 패키지에 있는 모든 클래스를 가져다사용하곘다는 의미로, 이름만 가져다가 쓸수있다.

  • 패키지가 다른 클래스를 사용해야 할 경우

  1. 패키지 명이 포함된 전체 클래스 이름으로 사용
package com.mycompany;

public class Car{
  com.hankook.Tire tire = new.com.hankook.Tire();
}
  1. import문으로 패키지를 지정하고 사용
package com.mycompany;

import com.hankook.Tire; => 내 코드에서 com 패키지의 하위 패키지인 hankook 패키지 안에있는 Tire 클래스를 import

public class Car{
  Tire tire = new Tire();
}

접근 제한자(Access Modifier)

public 멤버 : 동일한 패키지이든, 다른 패키지이든간에 어디서든 다 사용가능한 멤버
protected 멤버 : 동일한 패키지 내에서 다 사용가능 + 상속관계에서 상속받았을 경우 다른 패키지에서도 다 사용가능한 멤버
default 멤버 : 동일한 패키지내에서 다 사용가능한 멤버
private 멤버 : 같은 클래스 내에서만 사용가능한 멤버

종류

  • public
    • 어디에서나 접근 가능. 다른 패키지에서도 사용가능)
  • protected
    • 상속 관계에서만 public 처럼 작동하는 애.
    • 기본적으로는 default처럼 작동해서, 같은 패키지 안에서는 가져다 쓸수있음.
    • 하지만 내 패키지가 아니라 다른 패키지에 있는 클래스 중에서 상속 관계에 있는 경우에만 제한적으로 가져다 사용가능
  • default(또는 package private 이라고 부름)
    • 아무것도 안붙이면 default 인것이다.
    • 패키지 내에서 privte 처럼 작동
    • 다른 클래스더라도 같은 패키지 안에 있으면 사용가능)
  • private(상속 관계이던 같은 패키지이던간에 무조건 내 클래스 안에서만 사용가능)
  • 클래스에 붙일수있는 제한자는 public, default 2개이다. proeteced 와 private는 못붙임

getter, setter

profile
블로그 이전 : https://haon.blog

0개의 댓글