관리 메뉴

CASSIE'S BLOG

[슈퍼코딩] 30강 static과 변수유효범위 본문

PROGRAMMING/슈퍼코딩 강의 정리

[슈퍼코딩] 30강 static과 변수유효범위

ITSCASSIE1107 2023. 12. 11. 20:08
반응형

static이 왜 필요한지 알려면 이슈를 알면 이해하기가 편하다고함. 
 

 
필드를 하나 출력하려고 하는데 그게 학번 아이디다. 
이게 학교라는 시스템에서 각 학생의 고유한 번호를 자동으로 입력하는 변수라고 설정을 해보겠다. 
 
문제가 인스턴스를 만들 때마다 즉 studentId를 1씩 올릴려고 하는데 어떤걸 참고해서 추적하는게 있어야 제가 1씩 올릴 거 아니에요.
 

아무것도 없는데 어떻게 인스턴스 만들 때마다 1씩 올려요. 
그래서 학번을 추적하는 정보를 넣을거라고함
 
학번을 추적하는 정보가 이번에는 2를 만들어야합니다. 이번에는 3을 만들어야합니다. 이런 식으로 즉 각각의 개체들 각각의 인스턴트들이 공통으로 보고 있는 곳이 있어야한다. 공동으로 관리하고 있는 영역이 있어야한다. 그래야 객체가 만들어질 때 아 나는 아이디가 3이구나 그래서 공동경비구역같은 공간이 필요하다. 
 

 
static변수는 인스턴스가 "모두 같은" 걸 공유하고 있는 변수다. 
 

 
 

package exercise.chapter_30;

public class Student {

    //맨처음에 1로 초기화 어떻게 1로 올릴거냐 생성자를 사용할 예정
    static int serialNum = 1;

    //속성
    private String schoolName;
    private int classYear;
    private int classroomNumber;
    private int studentNumber;

    private int studentId;

    //기본정보
    private String name;
    private String gender;


    public Student() {
    }

    public Student(String pName, String pGender) {
        name = pName;
        gender = pGender;
    }

    //아무것도 안 적으면 default
    Student(String schoolName, int classYear, int classroomNumber, int studentNumber, int studentId, String name, String gender) {
        //생성자의 parameter에 serialNum을 넣는게 아니라 스스로 알아서 올라가라고 그냥 this.studentId = serialNum;
        //++ 하면 1씩 들어간다.
        //처음에는 초기화값된 값이 들어가고. 이후에 그게 끝나면은 1씩 올라가라 이 뜻임. 
        this.studentId = serialNum++;
        this.schoolName = schoolName;
        this.classYear = classYear;
        this.classroomNumber = classroomNumber;
        this.studentNumber = studentNumber;
        this.studentId = studentId;
        this.name = name;
        this.gender = gender;
    }

    public String getName() {
        return this.name;
    }
}

 
 
studentID 1씩 증가하는 거 만드는 법
 

package exercise.chapter_30;

public class StaticTest {

    public static void main(String[] args){
        //4명 정도 만들기
        Student student1 = new Student("Alice", "Female");
        Student student2 = new Student("Tom", "Male");
        Student student3 = new Student("Taylor", "Female");
        Student student4 = new Student("Mike", "Male");

        student1.printMyInfo();
        student2.printMyInfo();
        student3.printMyInfo();
        student4.printMyInfo();

    }
}

 
 
 
생성자에서  this.studentID = studentID 이걸 없애야함

package exercise.chapter_30;

public class Student {

    //맨처음에 1로 초기화 어떻게 1로 올릴거냐 생성자를 사용할 예정
    static int serialNum = 1;

    //속성
    String schoolName;
    private int classYear;
    private int classroomNumber;
    private int studentNumber;

    private int studentID;

    //기본정보
    private String name;
    private String gender;


    public Student() {
    }

    Student(String name, String gender) {
        this("school", 1, 3,-1, name, gender);
    }

    public void printMyInfo(){
        System.out.printf("[Student] schoolName: %s, classYear: %d, classroomNumber: %d, " +
                "studentNumber: %d, studentId: %d, name: %s, gender: %s\n",
                this.schoolName, this.classYear, this.classroomNumber, this.studentNumber, this.studentID,
                this.name, this.gender
                );
    }

    //아무것도 안 적으면 default
    Student(String schoolName, int classYear, int classroomNumber, int studentNum,  String name, String gender) {
        //생성자의 parameter에 serialNum을 넣는게 아니라 스스로 알아서 올라가라고 그냥 this.studentId = serialNum;
        //++ 하면 1씩 들어간다.
        //처음에는 초기화값된 값이 들어가고. 이후에 그게 끝나면은 1씩 올라가라 이 뜻임.
        this.studentID = serialNum++;
        this.schoolName = schoolName;
        this.classYear = classYear;
        this.classroomNumber = classroomNumber;
        this.studentNumber = studentNum;
        this.name = name;
        this.gender = gender;
    }

    public String getName() {
        return this.name;
    }
}

 

 
그래서 생성자에 추적하는 값 
이게 필요한 것임. 
생성자 매개변수는 6개이고
밑에 정의하는 건 7개 필드임. 

this.studentID = serialNum++;


static 안 붙이고 하면 계속 1임 그리고 생성자에서 바꿔치기 하면


private int serialNum2 = 1;

static을 안 붙였기 때문에 그냥 한 객체가
가지고 있다. 다른 객체가 하나 가지고 다른 객체는 아무 상관 없다.

static을 붙이면 모든 객체가 그
친구를 바라본다.

static 변수 = 정적 변수
정적이라는 말이 변하지 않는다의 정적이 아니라 클래스에 속해있다는
말이라고 함
클래스는 설계도라고 했잖아
설계도에 정적으로 같이 있다. 그래서 정적변수라고 한다고 함



static은 그냥 설계도 도면에 영향을 끼친다. 생각하면 된다고 함

정리하면
static = 정적 변수
= 프로그램 실행 시 정적 생성,
(인스턴스 생성 전 정의 되어 있음)

즉 new라는 걸로 인스턴스화 시키지않아도 이미 생성되어 있는 변수가 됩니다.

static 안 붙인 친구들은 멤버변수 (=속성) 이 되고 각 인스턴스에 속하는 친구들이다.

static 변수는 클래스에 속해있기 때문에 클래스 변수라고도 한다.

클래스로 바로 호출도 가능하다.

이렇게
int num2 = student1.serialNums;

인스턴스를 하지 않고도 부를 수 있다.

사실 객체에서도 접근이 가능하다.

객체는 클래스를 바탕으로 만들어진거라서



클래스 변수
인스턴스 변수
로컬 변수
이렇게 범위가 점점 작아짐
 
 


  • public : 클래스(Class) 외부에서 사용할 수 있도록 공개
  • private : 클래스(Class) 외부에서 사용할 수 없도록 비공개
  • protected : 클래스(Class) 외부에서 사용할 수 없도록 비공개하지만, 상속받은 자식 클래스에게만 사용할 수 있도록 공개

자바는 private과 protected를 통해 외부에서 접근을 못하도록 할 수 있기 때문에, 자료의 은폐화 혹은 캡슐화(Encapsulation, 인캡슐레이션) 를 가질 수 있는 언어라고 말한다.
 
이 부분 출처: 
https://caileb.tistory.com/139

java - public, private, protected

접근제어자 (Access Modifier) public, private, protected 접근제어자 3가지 자바(Java)의 접근제어자는 private, public, protected 3가지이다. public : 클래스(Class) 외부에서 사용할 수 있도록 공개 private : 클래스(Clas

caileb.tistory.com



변수
변수에는 세종류가 있습니다. 클래스변수, 인스턴스변수, 지역변수 변수의 종류를 나누는 기준은 변수의 선언 된 위치입니다.
• 지역변수(local variable) : 멤버변수를 제외한 나머지 변수
• 클래스변수(classvariable) : 멤버변수
중 static이 붙은 것
• 인스턴스변수(instance vatiable) : 멤버변수 중 staticol 붙지 않은 것.



반응형