[24.09.24] TIL

yy·2024년 9월 24일

개발일지

목록 보기
108/122

JAVA공부중

기본형 & 참조형

정의

  • 기본형(Primitive Type) : 변수에 사용할 값을 직접 넣을 수 있는 데이터 타입
  • 참조형(Reference Type) : 데이터에 접근하기 위한 참조(주소)값을 저장하는 데이터 타입

변수대입

항상 변수의 값을 복사해서 대입

  • 기본형 : 값을 복사하여 대입
  • 참조형 : 참조값(주소값)를 복사하여 대입

메서드 호출

항상 변수의 값을 복사해서 대입

// 기본형 메소드
public class MethodChange1 {

public static void main(String[] args) {
		int a = 10;
		System.out.println("메서드 호출 전: a = " + a); // 10 			
        changePrimitive(a);
		System.out.println("메서드 호출 후: a = " + a); // 10    
    }
    
static void changePrimitive(int x) {         
		x = 20;
    } 
}

메서드 호출 후가 10인 이유는 메서드에 기본형타입 a값을 대입만 해줬지 a값이 바뀐 것은 아니기때문.


public class MethodChange2 {

public static void main(String[] args) {
			Data dataA = new Data();
        	dataA.value = 10;
			System.out.println("메서드 호출 전: dataA.value = " + dataA.value); 
            changeReference(dataA);
			System.out.println("메서드 호출 후: dataA.value = " + dataA.value);     
            }

static void changeReference(Data dataX) {         
		dataX.value = 20;
    	} 
}

참조형타입은 참조값(주소값)만 복사하기때문에 인스턴스 안에 접근해서 값을 변경.




객체 지향 프로그래밍

데이터(필드)와 기능(메서드)이 분리되어 유지보수에 어려운 절차 지향 프로그래밍을 개선하고자한 프로그래밍.
클래스에 데이터와 기능을 모아 관리 -> 유지보수 good

생성자

  • 객체 생성 후 바로 초기화를 하기 위해 등장.
  • 생성자 없을 때는 객체 생성 후 메소드를 이용해서 초기화해야했었기에 중복 호출을 안할 수 있음. 직접 정의한 생성자를 반드시 호출해서 사용해야한다.
  • 생성자가 하나라도 있으면 기본 생성자(매개변수가 없는 생성자) 만들지 않음

this

상위 계층의 본인을 가르킴. 생성자에서 사용 시 this는 인스턴스 자신의 참조값을 가르킴.

오버로딩

같은 이름을 가지고, 매개변수가 다른 생성자를 만드는 것을 오버로딩한다 함.

public class MemberConstruct {
	String name;
	int age;
	int grade;
MemberConstruct(String name, int age) {
		this(name, age, 50); //변경. 생성자 코드의 첫줄에만 작성 가능
    }
MemberConstruct(String name, int age, int grade) {
		System.out.println("생성자 호출 name=" + name + ",age=" + age + ",grade=" + grade);
		this.name = name; 
        this.age = age; 
        this.grade = grade;
    } 
}




접근제어자

속성과 기능을 외부로부터 숨기기 위해 사용.

  • private : 나의 클래스 안으로 속성과 기능 숨길 때 사용. 외부 클래스에서 해당 호출 불가능.
  • default : 나의 패키지 안으로 속성과 기능 숨길 때 사용. 외부 패키지에서 해당 시능 호출 불가능.
  • protected : 상속 관계로 속성과 기능을 숨길 때 사용. 상속아닌 곳에서 호출 불가능.
  • public : 숨길 마음 없이 사용

접근제어자 사용 - 필드, 메서드

package access.a;

public class AccessData {
      public int publicField;
      int defaultField;
      private int privateField;

      public void publicMethod() {
              System.out.println("publicMethod 호출 "+ publicField);     
              }

      void defaultMethod() {
          System.out.println("defaultMethod 호출 " + defaultField);     
      }

      private void privateMethod() {
          System.out.println("privateMethod 호출 " + privateField);     
          }

      public void innerAccess() { 
          System.out.println("내부 호출");
          publicField = 100;         
          defaultField = 200;         
          privateField = 300;
          publicMethod(); 
          defaultMethod(); 
          privateMethod();
          }     
}
package access.b;

import access.a.AccessData;

public class AccessOuterMain {
	public static void main(String[] args) { 
    	AccessData data = new AccessData(); //public 호출 가능
        data.publicField = 1;         
        data.publicMethod(); //다른 패키지 default 호출 불가 					//data.defaultField = 2; 
        //data.defaultMethod();
		//private 호출 불가
		//data.privateField = 3; 
        //data.privateMethod();
       data.innerAccess();     
       }
}

접근제어자 사용 - 클래스 레벨

  • 클래스 레벨의 접근 제어자 규칙
    - public, default만 사용 가능
    • public클래스는 반드시 파일명과 이름이 같아야함.
    • 하나의 자바파일에 public 클래스는 하나만 등장 해야함.
    • 하나의 자바파일에 default 클래스는 무한정 생성 가능.
package access.a;

public class PublicClass {
public static void main(String[] args) {
	PublicClass publicClass = new PublicClass(); 
    DefaultClass1 class1 = new DefaultClass1(); 
    DefaultClass2 class2 = new DefaultClass2();
    }
}

class DefaultClass1 { 
}

class DefaultClass2 { 
}
package access.a;

public class PublicClassInnerMain {
public static void main(String[] args) { 
	PublicClass publicClass = new PublicClass(); 
    DefaultClass1 class1 = new DefaultClass1(); 
    DefaultClass2 class2 = new DefaultClass2();
    } 
}


캡슐화

  • 데이터 숨기고, 기능은 필요한 것만 노출시키고 나머지는 숨기는게 좋은 캡슐화.
  • 객체의 데이터는 객체가 제공하는 메서드를 이용해서 접근해야함.


자바 메모리 구조

  • 메서드 영역(Method Area) : 프로그램 실행하는데 필요한 공통 데이터 관리. (클래스 정보, static 영역, 런타임 상수 풀)
  • 스택 영역(Stack Area) : 자바 실행 시 하나의 실행 스택 생성됨. 각 스택 프레임은 지연변수, 중간 연산 결과, 메서드 호출 정보등 포함
  • 힙 영역(Heap Area) : 객체(인스턴스)와 배열이 생성되는 영역. 가비지 컬렉션이 이뤄지는 주요 영역.

static

static 변수 & 메서드

static 을 붙이는 변수와 메서드는 객체의 변수와 메서드가 아닌 클래스의 변수와 메서드가 된다. 접근 제어자만 허락하면 클래스를 통해 호출할 수 있음.

변수

static이 붙었느냐 안붙었느냐에 따라 필드의 이름이 달라짐.

  • static X : 인스턴스 변수. 인스턴스를 생성해야 사용할 수 있는 변수. 인스턴스에 소속. 인스턴스를 만들 때마다 새로 생성됨.
  • static O : 클래스변수, 정적변수, static변수. 인스턴스와 무관하게 클래스에서 바로 접근해서 사용 가능. 인스턴스와 다르게 보통 여러곳에서 공유하는 목적으로 사용(공용변수 같은거)

메서드

static이 붙었느냐 안붙었느냐에 따라 메서드 이름이 달라짐.

  • static X : 인스턴스 메서드. 인스턴스를 생성해야 사용할 수 있는 메서드.
  • static O : 클래스메서드, 정적 메서드.


final

변수에 final이 붙으면 값을 변경할 수 없음. (마치 자바스크립트의 const 와 같음.)
final은 변수, 클래스, 메소드를 포함한 여러 곳에 붙을 수 있음.

변수는 무조건 최초 한번만 할당이 가능한데 기본형의 경우 값을 넣어주기때문에 상수로도 사용된다. 하지만 참조형의 경우 참조값(주소값)이 고정이기 때문에 참조형 내부의 값들은 변경이 가능하다.

상수로 쓰이는 경우 대문자로 사용하며, 언더바(언더스코어)를 이용해서 띄어쓰기를 표시한다.(public static final double PI = 3.14; 처럼)

변수를 공용상수로 사용하지 않을때는 고객의 id와 같이 변하면 안되는걸 final처리하여 사용한다.

profile
시간이 걸릴 뿐 내가 못할 건 없다.

0개의 댓글