여니의 프로그래밍 study/Java

[Java] 변수와 메서드

여니's 2022. 7. 18. 15:04

목차

    < 변수 >

     

     

    변수의 종류는 2가지의 기준으로 나눌 수 있다.

    첫 번째로는 타입에 따라서, 

    두 번째로는 선언 위치에 따라서!


    1. 타입에 따른 분류

    (1) Primitive type variable (기본형)

    - 미리 정해진 크기의 메모리 사이즈로 표현되고 변수 자체에 값이 저장된다.

    - 8가지의 타입(자료형)이 있다.

    - 기본형 타입은 메모리 중에 스택에 저장된다.

    - 컴파일 시점에 담을 수 있는 크기를 벗어나면 컴파일 에러 발생

    - 변수의 값을 읽기만 할 수 있다. (read only)

    분류 타입
    논리형 boolean
    문자형 char
    정수형 short,byte,int,long
    실수형 float, double

    https://eboong.tistory.com/550

     

    [Java] 데이터 타입 (+double형, float형 ), 형변환

    https://opentutorials.org/course/1223/5375 데이터 타입 - 생활코딩 데이터 타입은 조금 어렵다. 후속 수업에서 필수적인 선행지식은 아니지만, 또 뒤에 배치하는 것도 애매하다. 이번 토픽의 학습이 어렵

    eboong.tistory.com

     

    (2) Reference Type variable (참조형)

    - 크기가 미리 정해질 수 없는 데이터의 표현으로 변수에는 실제 값을 참조할 수 있는 주소만 저장된다.

    - 변수의 값을 읽고 변경할 수 있다. (read & write)

    - 메모리 중 에 저장된다.

    - 문법상으로는 에러가 없지만 실행시켰을 때 에러가 나는 런타임 에러가 발생

    타입 기본값
    배열 Null
    열거 Null
    클래스 Null
    인터페이스 Null

     


    2. 선언 위치에 따른 분류

    크게 멤버 변수와 지역 변수로 나눌 수 있다. 

     

    class Solution{
        int num; // 인스턴스 변수
        static int num; // 클래스변수
        
        public static void main(String[] args){ // 파라미터 변수
        {
        	int num2=0; // 지역 변수
        }   
    }
    종류 변수의 종류 선언위치 생성시기 생성
    메모리
    영역
    접근 방식
    멤버
    변수

    클래스 변수 클래스 영역 클래스가 메모리에 올라갔을 때 heap  객체 생성 후 
    객체 이름으로 접근
    인스턴스 변수 인스턴스가 생성되었을 때 클래스 이름으로
    접근
    지역
    변수


    지역 변수 클래스 영역 이외의 영역
    (함수 내부)
    변수 선언문이 수행되었을 때 thread 별로
    생성된
    stack 영역
     
    파라미터 변수 클래스 영역 이외의 영역
    (함수 선언부)

     

    (1) 멤버 변수 

    클래스 멤버 변수

    - 인스턴스 변수 앞에 static을 붙인다.

    - 모든 인스턴스가 공통된 저장공간을 공유한다. (<-> 인스턴스 멤버 변수)

    - 소멸 시점 : 프로그램 종료 시

    Person.name = "여니2";

     

    인스턴스 멤버 변수

    - 인스턴스는 클래스에 소속된 개별적인 객체를 의미하며 

    해당 클래스의 구조로 컴퓨터 저장공간에서 할당된 실체를 의미한다. 

    인스턴스마다 독립적인 저장공간을 갖는다. 

     

    - 소멸 시점 : Garbage Collector에 의해 객체가 없어질 때,

    프로그래머가 명시적으로 소멸시킬 수 없다.

    Person person = new Person();
    person.name="여니";


     

    (2) 지역 변수

     지역 변수 & 파라미터 변수

    - 소멸 시점 : 선언된 영역인 {} 중괄호를 벗어날 때

     

    public static void main(String[] args){ // 파라미터 변수
    {
        int num2=0; // 지역 변수
    }

    3. 변수의 초기화

    : 변수를 선언하고 처음으로 값을 저장하는 것을 의미한다. 

    멤버 변수는 자동적으로 초기화가 이루어진다.

    하지만, 지역 변수는 사용하기 전에 반드시 초기화를 해야한다. 

     

    멤버변수의 초기화 방법

    1. 명시적 초기화
    2. 생성자
    3. 초기화 블럭

    1. 명시적 초기화

    : 변수를 선언과 동시에 초기화하는 것을 의미한다. 

    // 기본형 변수의 초기화
    int a = 10;
    // 참조형 변수의 초기화
    Student student= new Student();

     

    2. 초기화 블럭

    클래스 초기화 블럭 클래스변수의 복잡한 초기화에 사용된다. - 클래스가 메모리에 처음 로딩될 때 딱 한번만 수행
    인스턴스 초기화 블럭 인스턴스변수의 복잡한 초기화에 사용된다. - 생성자와 같이 인스턴스를 생성할때마다 수행된다. 
    - 생성자보다 인스턴스 초기화 블럭이 먼저 수행된다.
    class Student{
    	static { /* 클래스 초기화블럭 */ }
        { /* 인스턴스 초기화블럭 */}
    
    Student() {
    	std++;
        studentNo=std;
        name="yeony";
    }
    Student(String name){
    	std++;
        stduentNo=std;
    	this.name=name;
    }
    
    -> 중복되는 부분 제거
    
    {
    	/* 인스턴스 초기화블럭 */
    	std++;
        studentNo=std;
    }
    Student() {
        name="yeony";
    }
    Student(String name){
    	this.name=name;
    }

    4. 변수 선언 과정 예시

    클래스의 인스턴스화

    : 클래스로부터 객체를 만드는 과정

     

    클래스의 인스턴스

    : 어떤 클래스로부터 만들어진 객체

    class Tv{
    	String color;
        boolean power;
        int channel;
        
        void power() {power !=power;}
        void channelUp() {++channel;}
        void channelDown() {--channel;}
    }
    
    class TvTest{
    	public static void main(String args[]){
            Tv t; // Tv인스턴스를 참조하기 위한 변수 t 선언
            t=new Tv(); // 연산자 new를 통해 Tv 인스턴스 생성
            t.channel=7; // Tv인스턴스의 멤버변수 channel의 값을 7로 설정
            t.channelDown(); // Tv인스턴스의 channelDown 메서드를 호출함
    }

     

    인스턴스는 참조 변수를 통해서만 다룰 수 있고,

    참조 변수의 타입은 인스턴스의 타입과 일치해야 함.

     

    (인스턴스를 만들어내서 관리하는 목적)

    같은 클래스로부터 인스턴스를 생성했을지라도

    각 인스턴스의 속성은 서로 다른 값을 유지할 수 있다.

     

     

    둘 이상의 참조 변수가 하나의 인스턴스를 가리키는 것은 가능함

    하지만,

    하나의 참조변수로 여러 개의 인스턴스를 동시에 가리키는 것은 불가능하다. 

     


    5. 변수의 종류

     

    (1) 인스턴스 변수

    : 클래스의 인스턴스를 생성할 때 만들어진다.

    인스턴스마다 고유한 상태를 유지해야하는 속성의 경우 인스턴스 변수로 선언한다.

     

     

     

    (2) 클래스 변수 

    : 인스턴스 변수 앞에 static을 붙인다. 

    모든 인스턴스가 공통된 저장공간(변수)을 공유하게 된다. 

    클래스가 메모리에 올라갈 때 생성되어 프로그램 종료시까지 유지된다. 

    public을 앞에 붙이면 같은 프로그램 내에서 어디서나 접근 가능한 전역변수의 성격을 갖는다. 

     

     

    (3) 지역 변수

    : 변수 선언문이 수행되었을 때 생성된다. 

    메서드 내에 선언되고 메서드 내에서만 사용이 가능하다. 

     


    6. 클래스 메서드 , 인스턴스 메서드

    (1) 클래스 메서드

    : 메서드 앞에 static이 붙어있는 메서드

    객체를 생성하지 않아도 클래스이름.메서드이름 식으로 호출이 가능하다.

    클래스 변수는 클래스가 메모리에 올라갈 때 이미 자동적으로 생성되기 때문이다. 

     

     


    다음 글

    https://eboong.tistory.com/565

     

    [Java] 상속

    목차 상속이란? : 기존의 클래스를 재사용하여 새로운 클래스를 작성하는 것을 의미한다. 상속의 이점 - 적은 양의 코드로 새로운 클래스를 작성할 수 있다. - 코드의 추가 및 변경이 매우 용이하

    eboong.tistory.com

     

    참고 출처 : 자바의 정석