본문 바로가기
자바(Java)

자바 입문하기8 - 클래스, 참조타입

by codeyaki 2022. 1. 10.
반응형

해당 강의를 보고 정리한 것입니다.

https://programmers.co.kr/learn/courses/5

 

자바 입문

자바 입문 가장 널리 쓰이는 프로그래밍 언어 Java로 프로그래밍의 기초를 다져보세요. 이 강의의 내용을 책으로 만나고 싶으시면 여기를 눌러 책 정보를 확인하세요. 강의를 다 들었는데, 지금

programmers.co.kr

 


객체지향이란?

 : 객체들이 상호작용 하도록 프로그래밍하는 것
  -객체 : 프로그램을 구성하는 요소

클래스

: 객체를 만들기 위한 틀

예) 객체 - 붕어빵 // 클래스 - 붕어빵 틀

  • 생성 방법
    public class 클래스명 {  
     클래스 내용
    }​
  • 객체 생성하기 
    public class CarExam {
    
    	public static void main(String[] args) {
    		Car c1 = new Car();
    		Car c2 = new Car();
    		
    	}
    
    }​
    - new 연산자는 new연산자 뒤에 나오는 생성자를 이용해 메모리에 객체를 생성하라는 명령
    - 메모리에 만들어진 객체 : 인스턴스(instance)
    - 해당 코드에선 Car 객체 2개 생성되고 각각 개체를 c1, c2변수가 참조되도록 선언

참조 타입

: 참조형 타입은 기본형 타입을 제외한 모든 타입 (배열, 클래스 등)

public class ReferenceDataType {

	public static void main(String[] args) {
		int i = 4; // 기본형 타입
		
		String str = new String("Hello");
	}

}​

 

  • 메모리에 올라간 인스턴스를 가리키는 변수, 참조하는 변수, 레퍼런스 하는 변수가 str
    (참조한다, 레퍼런스 한다 = 변수가 인스턴스를 가지고 있는 게 아닌 "참조"한다. 즉, 말 그대로 가리킨다의 의미.)
  • str 변수에 메모리의 주소 값이 저장되는 것. but 어떤 메모리에 저장되는지 그 정보를 알 수 있는 방법은 없다.
    그렇기 때문에 str 변수는 String 인스턴스를 참조한다라고만 알아 두자.
  • 클래스들은 모두 참조형이다.
  • 메모리상에서의 참조 변수

필드(field) 선언

: 해당 클래스가 가지고 있는 것(속성)
자동차는 자동차 이름, 자동차 번호를 가지고 있고, 자동차는 달리고 멈추는 기능이 있음.

  • 이름과 번호를 필드로 가지고 있는 Car클래스 선언
    public class Car {
    	String name;
    	int number;​
  • Car 클래스 인스턴스화 하기
    public class CarExam {
    
    	public static void main(String[] args) {
    		Car c1 = new Car();
    		Car c2 = new Car();	
    	}
    }
  • 속성 이용하기
      - 참조 변수 다음에 나오는 점(dot)은 참조 변수가 참조하는 객체가 가지고 있는 것을 사용
    public class CarExam {
    
    	public static void main(String[] args) {
    		Car c1 = new Car();
    		Car c2 = new Car();
    		
    	    //c1.name은  c1이 참조하는 객체의 name 을 의미.
    
    	    c1.name = "소방차";  //c1이 참조하는 객체의 name을 소방차로 설정 
    	    c1.number = 1234;   // c1.number = 1234란 c1이 참조하는 객체의 number를 1234 로 설정 
    
    	    c2.name = "구급차";  //c2가 가리키는 객체의name을 구급차로 설정
    	    c2.number = 1004;  //c2가 가리키는 객체의 number를 1004로 설정
    
    
    	    System.out.println(c1.name);  //콘솔에 c1이 참조하는 객체의 name 을 출력합니다. 
    	    System.out.println(c1.number); //콘솔에 c1이 참조하는 객체의 number 를 출력합니다. 
    
    	    String name = c2.name;   //c2가 참조하는 객체의 name 을 String 타입 변수 name 도 참조하게 합니다.
    	}
    
    }

메서드

: 클래스가 가지고 있는 기능. 클래스 안에 선언됨

필드가 물체의 상태라면, 물체의 행동에 해당.

car에 이름과 번호가 있기도 하지만, car는 앞으로 전진할 수도 있고 후진하는 행동도 할 수 있다.

  • 메서드는 입력값이 있고, 그 입력값을 받아서 무언가 한 다음 결과를 도출해 내는 수학의 함수와 비슷
  • 입력값을 매개변수라고 하고, 결과 값을 리턴 값이라고 함.
    - 인자(argument) : 함수 호출 시 전달되는 값
    - 매개 변수(parameter) : 전달된 인자를 받아들이는 변수

메서드 선언

  • 매개변수도 없고 리턴하는 것도 없는 형태
    - 리턴하는 것이 없을 경우(void)
    public void method1() {
    	System.out.println("method1이 실행");
    }
  • 정수를 받아들인 후 리턴하지 않는 메서드
    - 받아들이는 값은 어떤 타입이라도 상관없다.
    - 받아들이는 값의 수는 여러 개 일 수 있다. 여러 개일 경우 콤마(,)로 구분한다.
    public void method2(int x, int y) {
    	System.out.println(x + " + " + y + " = " + x+y);
    }
  • 아무것도 받아들이지 않고, 정수를 반환하는 메서드
    - 리턴하는 값 앞에 return이라는 키워드를 사용
    - 메서드 이름 앞에는 리턴하는 타입
    - 리턴 타입은 하나만 사용 가능. (어떤 타입이라도 상관없음)
    public int method3() {
    	System.out.println("method3");
    	return 10;
    }​
  • 정수 2개 매개변수, 아무것도 반환하지 않는 메서드
    메서드 "," + y +"를 이용하는 method4");
    }​
     
  • 정수 한 개 받아들인 후, 정수를 반환하는 메서드
    public int method5(int x) {
    	System.out.println(x + "를 이용하는 method5");
    	return 5;
    }​
  • 사용
    MyClass 클래스
    public class MyClass {
    	public void method1() {
    		System.out.println("method1이 실행");
    	}
    	
    	public void method2(int x) {
    		System.out.println(x + "를 이용하는 method2");
    	}
    	
    	public int method3() {
    		System.out.println("method3");
    		return 10;
    	}
    	
    	public void method4(int x, int y) {
    		System.out.println(x + "," + y +"를 이용하는 method4");
    	}
    	
    	public int method5(int x) {
    		System.out.println(x + "를 이용하는 method5");
    		return 5;
    	}
    }​
     

메서드 사용하기

  • 메서드가 정의된 클래스 MyClass가 생성돼야 함
  • 객체 생성 시 new연산자 사용
  • 생성된 클래스를 참조하는 레퍼런스 변수. 메서드명()으로
    public class MyClassExam{
    	public static void main(String[] args) {
    		MyClass c1 = new MyClass();
    		c1.method1();
    		c1.method2(3);
    		int x = c1.method3();
    		System.out.println("method3의 리턴값 : " + x);
    		c1.method4(5, 7);
    		int y = c1.method5(9);
    		System.out.println("method4의 리턴값 : " + y);
    	}
    }
    >>
    method1이 실행
    3를 이용하는 method2
    method3
    method3의 리턴값 : 10
    5,7를 이용하는 method4
    9를 이용하는 method5
    method4의 리턴값 : 5

메서드 호출에서의 참조 타입과 기본형 타입의 차이

public class ReferenceDataType {
	public void addOne(int x) {
		x++;
	}
	public void addOne(int[] arr) {
		for(int i=0; i<arr.length;i++) {
			arr[i]++;
		}
	}
	public static void main(String[] args) {
	ReferenceDataType exam = new ReferenceDataType();
	int value = 10;
	int[] arr = {10};
	exam.addOne(value);
	exam.addOne(arr);
	
	System.out.println(value);
	System.out.println(arr[0]);
		
	
	}

}
  • addOne 메서드 : 전달받은 값을 +1 더해주는 메소드
  • value의 경우 : value를 addOne의 매개변수로 넣어주면 addOne 메소드 내부에서 value와 같은 값의 x라는 새로운 인스턴스를 생성해서 사용함.
    즉, value와 addOne내부의 x는 다른 인스턴스이기 때문에 x를 변화시켜도 value는 변화하지 않음.
  • arr의 경우 : arr는 참조값(배열의 주소 값)이므로 매개변수로 arr를 주어도 addOne 내부의 argArr 또한 같은 배열을 인스턴스로 사용함.
    즉, arr와 addOne내부의 argArr는 같은 인스턴스이기 때문에 argArr의 값이 변화 시 arr값도 변화함.
반응형

'자바(Java)' 카테고리의 다른 글

자바 입문하기10 - scope, static, enum  (0) 2022.01.10
자바 입문하기9 - String  (0) 2022.01.10
자바 입문하기7 - for each  (0) 2022.01.07
자바 입문하기6 - 이차원 배열  (0) 2022.01.07
자바 입문하기5 - 배열  (0) 2022.01.07