참조 자료형
클래스 만들기 위해 : 인스턴스 변수 / 클래스 변수 / 생성자 / 메소드
기본 생성자
public class ReferenceDefault { public static void main (String [] args) { ReferenceDefault reference = new ReferenceDefault(); } }ReferenceDefault() = 기본 생성자 // main 메소드에서 다른 생성자가 없을 경우 기본으로 컴파일 할 때 만들어짐
매개변수가 있다면 앞에 매개변수가 없는 생성자를 만들어 준 후 컴파일하면 됨
public class ReferenceDefault { public ReferenceString() {} public ReferenceString(String arg) {} public static void main (String [] args) { ReferenceDefault reference = new ReferenceDefault(); } }
Java 생성자 필요한 이유?
패턴이란?
비슷한 기능을 하는 규칙에 하나의 이름을 정해놓은 것.
개인정보 DTO
public class MemberDTO { public String name; public String phone; public String email; }
이렇게 DTO를 만들어놓을때의 장점
자바의 메소드를 선언할 때 리턴 타입은 한가지만 선언가능.
이와 같이 복합적인 테이터를 리턴하려면 String[]과 같이 배열을 리턴해도 되겠지만, int타입까지 포함되어있으면 애매하다.
그래서 DTO를 만들면 그 객체를 리턴하면 됨.
->
public MemberDTO getMemberDTO() { MemberDTO dto = new MemberDTO(); return dto; }public class MemberDTO { public String name; public String phone; public String email; ㅤ public MemberDTO() { } // 아무정보도 모를 때 ㅤ public MemberDto(String name) { this.name = name; } // 이름만 알 때 ~
예약어 this
객체의 변수와 매개변수의 이름이 동일할 때, 인스턴스의 변수를 구분하기 위해 사용
public class ReferenceConstructor { public static void man(String args[]) { ReferenceConstructor reference = new ReferenceConstructor(); reference.makeMemberObject(); } public void makeMemberObject() { MemberDTO dto1 = new MemberDTO(); MemberDTO dto2 = new MemberDTO(“sangmin”); MemberDTO dto3 = new MemberDTO(“sangmin”,”010-1111-1111”); }
-> 이렇게 생성자를 모두 활용하여 객체 생성가능
-> 세가지 생성사로 만든 객체들은 서로 다른 속성값 가짐
this 예약어
= ‘ 이 객체 ‘
생성자와 메소드 안에서 사용가능
this.name(클래스 인스턴스 변수) = name (파라미터-매개변수)
메소드 overloading
클래스의 생성자는 매개변수들을 서로 다르게하여 선언 가능 / 메소드도 가능!
public class ReferenceOverloading { public static void main (String args[]) { ReferenceOverloading reference = new ReferenceOverloading(); } public void print(int data) { } public void print (String data) { } public void print (int intData, String stringData) { } pubic void print (String stringData, int intData) { } }-> 파라미터의 개수가 같아도 타입의 순서가 다르면 다른 메소드로 인식
overloading
매소드의 이름을 같게하고, 매개 변수만을 다르게 하는 것
= 매개변수에 따라 다르게 메소드를 사용할 필요 없는 편리함을 위해 존재
메소드에서 값 넘겨주기
메소드 종료 조건
1) 메소드의 모든 문장이 실행되었을 때
2) return문장에 도달했을 때
3) 예외가 발생(throw)했을 때
void?
메소드는 모든 기본 자료형과 참조 자료형 중 하나를 리턴
public class ReferenceReturn { public static void main(String args[]){ ReferenceReturn reference = new RefereneceReturn(); System.out.println(reference.intReturn()); System.out.println(reference.intArrayReturn()); System.out.println(reference.StringReturn()); } public int intReturn() { int returnInt = 0; return returnInt; } ~
void 문에서도 return만 적을 수 있음 (메소드 종료)
static메소드와 일반 메소드의 차이
static : 객체를 생성하지 않아도 메소드 호출 가능
public class ReferenceStatic { public static void main(String args[]) { ReferenceStatic.staticMethod(); } public static void staticMethod() { System.out.println(“this is static”); } }
static메소드는 클래스 변수만 사용가능
public static String name = 클래스로 변환해서 객체 생성 안해도 사용가능
하지만 문제 발생 가능
public class ReferencStaticVariable { static String name; public ReferenceStaticVariable() {} public ReferenceStaticVariable(String name) { this.name = name; } public static void main(String args[]) { ReferenceStaticVariable reference = new RefereneceStaticVariable(); reference.checkName(); } public void checkName() { ReferenceStaticVariable reference1 = new ReferenceStaticVariable(“Sangmin”); System.out.println(reference1.name); ReferenceStaticVariable reference2 = new ReferenceStaticVariable(“Sunghoon”) System.out.println(reference1.name); } }
Sangmin만 두 번 나와야한다고 생각하겠지만 각 각 한번씩 출력됨
이유: name이 인스턴스 변수가 아니라 static으로 선언한 클래스 변수이기 때문
static 블록
객체는 여러 개 생성하지만 한 번만 호출되어야하는 코드가 있을 때 “Static 블록” 사용
static { //딱 한 번만 수행될 코드 }
pass by value, pass by reference
public class ReferencePass{ public static void main(String args[]){ ReferencePass reference = new ReferencePass(); reference.callPassByValue(); } public void callPassByValue(){ int a = 10; String b = “b” System.out.println(“before passByValue”); System.out.println(“a =”+a); System.out.println(“b=”+b); passByValue(a,b); System.out.println(“after passByValue); System.out.println(“a =”+a); System.out.println(“b=”+b); } public void passByValue(int a, String b) { a = 20; b = “z” System.out.println(“in passByValue”); System.out.println(“a =”+a); System.out.println(“b=”+b); } }
pass by value : 값을 전달하는 역할, 호출되기 전과 후에 데이터가 변경되지 않음 (기본자료형)
public class ReferencePass{ public static void main(String args[]) { ReferencePass reference = new ReferencePass(); reference.callPassByReference(); } public void callPassByReference() { MemberDTO member = new MemberDTO(“sangmin”) System.out.println(“before passByValue”); System.out.println(“member.name=”+member.name); passByReference(member); System.out.println(“after passByValue); System.out.println(“member.name=”+member.name); } ㅤ public void passByReference(MemberDTO member) { member.name = “sunghoon” System.out.println(“in passByValue”); System.out.println(“member.name=”+member.name); } }
-> 매개변수로 참조자료형을 넘길 경우 메소드 안에서 객체의 상태를 변경한 결과에 영향을 받음
매개변수를 지정하는 특이한 방법
자바에는 임의 개수의 매개변수를 넘겨주는 방법이 있음
(배열로 넘겨줄수도 있지만 계산할 숫자들을 모두 배열로 만든 후 넘겨주어야하기 때문에)
public class MethodVarargs { public static void main (String args[]) { MethodVarargs varargs = new MethodVarargs(); varargs.calculateNubersWithArray (new int[] {1,2,3,4,5}); varargs.calculateNumber(1,2,3,4,5); } public void calculateNumberWithArray(int []numbers) { } public void calculateNumber(int …numbers) { int total = 0; for (int number:numbers) { int total = 0; for (int number:numbers) { total += number; } System.out.println(“Total =”+total); } }
printf(String format, Object…args)
MemberDTO dto = ne MemberDTO (“Sangmin”, “010-1111-1111”, java@gmail.com); System.out.printf(“Name: %s Phone: %s E-Mail: $s\n”, dto.name, dto.phone, dto.email);