생성자

생성자는 클래스로부터 객체를 생성할 때 자동으로 호출되는 메소드를 말한다. 객체의 멤버 변수 초기화를 담당하는 특수한 목적의 메소드이다.

 

생성자의 개념과 특징

  • 메소드 이름이 클래스 이름과 동일하다.
  • 리턴 타입이 없으며, void조차 허용하지 않는다.
  • 객체 생성 시 자동으로 호출되며, 일반 메소드처럼 참조 변수를 통해 호출할 수 없다.
  • 생성되는 객체의 멤버 변수 초기화를 담당한다.
  • 생성자가 하나도 정의되지 않은 클래스에는 기본 생성자가 자동으로 제공된다.
  • 하나의 클래스에 여러 개의 생성자를 오버로딩 할 수 있다.
  • this() 형태의 특수한 생성자가 있다.

 

기본 생성자

기본 생성자는 매개변수가 없는 생성자를 의미한다.

생성자의 가장 중요한 기능이 멤버 변수의 초기화인데, 기본 생성자는 매개변수를 가질 수 없기 때문에 멤버 변수를 기본값으로 초기화한다.

그래서 기본 생성자라는 이름을 갖게 된 것이다.

 

기본 생성자의 또 다른 특징으로는 클래스에 생성자가 하나도 없을 때 기본으로 제공된다는 것이다. 따라서 다음 두 클래스는 동일한 코드라고 볼 수 있다.

 

public class Student {
	String name;
    int score;
}
public class Student {
	String name;
    int score;
    
    Student() {}
}

 

 

생성자를 통해서 객체의 멤버변수를 초기화 하기

// 1. 클래스 선언부
public class Student {
    public String name;
    public int score;
    public boolean isPassed;
    public String major;

    public Student() {}

    public Student(String stdName, int stdScore, boolean stdIsPassed, String stdMajor) {
        name = stdName;
        score = stdScore;
        isPassed = stdIsPassed;
        major = stdMajor;
    }

    public void printInfo() {
        System.out.println(name + "의 전공 : " + major + " 점수 : " + score + " 시험 통과 여부 : " + isPassed);
    }

}

public Student() {}  는 기본생성자이고, 그 아래에 매개변수를 가지고 있는 public Student( ... ) {} 는 멤버변수 값을 초기화 해주는 오버로딩된 생성자이다.

 

기본 생성자로 객체를 선언하게 되면 멤버변수값들이 아래와 같이 기본값으로 초기화가 된다. int type의 score 는 0, boolean 타입의 isPassed는 false, 참조 변수 타입인 name, major는 null 값을 갖게 된다.

public class Main {
    public static void main(String[] args) {
        Student millpre = new Student();
        millpre.printInfo();
    }
}

 

아래와 같이 매개변수를 넣어 선언하게 되면 매개변수에 맞게 멤버변수 값들이 초기화 되는 것을 확인할 수 있다.

public class Main {
    public static void main(String[] args) {
        Student millpre = new Student("millpre", 90, true, "cs");
        millpre.printInfo();
    }
}

 

this() 생성자

생성자의 이름은 반드시 클래스의 이름과 동일해야 한다. 그런데 생성자 중에 클래스의 이름을 사용하지 않는 this() 라는 독특한 생성자가 존재한다.

this() 생성자를 이용하면 같은 클래스에 있는 다른 생성자를 호출할 수 있다. 이를 통해 생성자 내의 코드 중복을 제거할 수 있다.

코드를 보면 바로 이해할 수 있을 것이다.

// 1. 클래스 선언부
public class Student {
    public String name;
    public int score;
    public boolean isPassed;
    public String major;

    public Student() {}
    
    public Student (String stdName, int stdScore) {
        name = stdName;
        score = stdScore;
    }

    public Student(String stdName, int stdScore, boolean stdIsPassed, String stdMajor) {
        this(stdName, stdScore);
        isPassed = stdIsPassed;
        major = stdMajor;
    }

    public void printInfo() {
        System.out.println(name + "의 전공 : " + major + " 점수 : " + score + " 시험 통과 여부 : " + isPassed);
    }

}

 

728x90

'Language > JAVA' 카테고리의 다른 글

[JAVA] Enum 열거형  (0) 2023.11.04
[JAVA] Getter/Setter  (0) 2023.11.02
[JAVA] 값 복사와 주소 복사  (0) 2023.10.25
[JAVA] Java Collections / Array / ArrayList  (2) 2023.10.25
[JAVA] 테스트코드 작성하기  (1) 2023.10.24

값 복사와 주소 복사

자바에서 기본 타입의 변수는 값 자체가 복사되고, 참조 타입의 변수는 주소가 복사된다.

이 개념은 메소드를 호출할 때도 동일하게 적용된다.

 

값 복사

메소드의 매개변수가 기본 타입인 경우는 인자로 전달된 값이 매개변수에 복사되어 전달된다.

public class Main {
    public static void main(String[] args) {
        int firstScore = 99;
        int secondScore = 33;

        System.out.println("before(firstScore) : " + firstScore);
        System.out.println("before(secondScore) : " + secondScore);

        swapScore(firstScore, secondScore);

        System.out.println("after(firstScore) : " + firstScore);
        System.out.println("after(secondScore) : " + secondScore);
    }

    private static void swapScore(int score1, int score2) {
        int temp = score1;
        score1 = score2;
        score2 = temp;

        System.out.println("swqpScore() 에서 score1 : " + score1);
        System.out.println("swqpScore() 에서 score2 : " + score2);
    }
}

 

메소드가 호출되면서 매개변수를 통해 값이 복사되면서 main() 메소드 안에서 선언된 firstScore, secondScore 값이 swapScore() 메소드가 호출되는 순간 매개변수에 해당되는 score1, score2 변수에 복사되어 전달된다.

 

swapScore() 메소드에서 temp 변수를 이용하여 score1과 score2의 값을 교환하면 swapScore() 메소드에서는 값이 당연히 바뀌지만 main() 함수에서는 firstScore와 secodScore의 값이 바뀌지 않는다.

 

주소 복사

// 1. 클래스 선언부
public class Student {

    // 2. 멤버 변수
    public String name = "MillPRE";
    public int score = 52;
    public int firstScore;
    public int secondScore;
	
    
    // ~ 생략 ~
}
public class Main {
    public static void main(String[] args) {
        Student millpre = new Student();
        millpre.firstScore = 90;
        millpre.secondScore = 33;

        System.out.println("before(firstScore) : " + millpre.firstScore);
        System.out.println("before(secondScore) : " + millpre.secondScore);

        swapScore(millpre);

        System.out.println("after(firstScore) : " + millpre.firstScore);
        System.out.println("after(secondScore) : " + millpre.secondScore);
    }

    private static void swapScore(Student std) {
        int temp = std.firstScore;
        std.firstScore = std.secondScore;
        std.secondScore = temp;

        System.out.println("swqpScore() 에서 firstScore : " + std.firstScore);
        System.out.println("swqpScore() 에서 secondScore : " + std.secondScore);
    }
}


이전에 값 복사와는 다르게 millpre.firstScore와 millpre.secondScore 의 값이 maind에서도 바뀌는 것을 확인할 수 있다.

이는 main() 함수에서 swqpScore() 메소드를 호출할 때 millpre라는 참조변수가 참조하고 있는 Student 객체의 주소가 매개변수로 선언된 std 변수에 복사되기 때문이다.

swapScore 메소드가 호출되는 시점에 Student 객체는 millpre와 std 두 개의 참조 변수에 의해 공유되고 있는 상태가 된다.

 

728x90

'Language > JAVA' 카테고리의 다른 글

[JAVA] Getter/Setter  (0) 2023.11.02
[JAVA] 생성자  (0) 2023.10.25
[JAVA] Java Collections / Array / ArrayList  (2) 2023.10.25
[JAVA] 테스트코드 작성하기  (1) 2023.10.24
[JAVA] 메소드 Method  (0) 2023.10.19

What is the Java Collections?

Java에서 Collection이란 개체 그룹을 저장(store)하고 조작(manipulate)하기 위한 아키텍처를 제공하는 프레임워크이다.

Java Collection Framework는 많은 인터페이스와 클래스를 제공한다.

  • Set
  • List
  • Queue
  • Dequeue
  • ArrayList
  • Vector
  • LinkedList
  • PriorityQueue
  • HashSet
  • LinkedHashSet
  • TreeSet

 

Hierarchy of Collection Framework

아래 그림은 Java Collection Framework의 계층구조이다. 

이들중에서 오늘은 ArrayList에 대해 알아보고 Array와 ArrayList의 차이점에 대해 알아볼 것이다.

 

 


Array

Java 공식문서에서 Array에 대한 설명은 다음과 같다.

public final class Array
extends Object
The Array class provides static methods to dynamically create and access Java arrays.
Array permits widening conversions to occur during a get or set operation, but throws an IllegalArgumentException if a narrowing conversion would occur.

 

번역하면 Array class는 자바 배열을 동적으로 생성하고 접근하는 정적 메소드를 제공한다.

Array는 get 또는 set 동작을 하는동안 확대 변화는 허용하지만 축소는 에러를 발생시킨다.

 

즉 Array를 선언할때 처음 초기화한 크기로 고정이 되며 변경할 수 없다는 것이다.

int[] arr = new int[3];

arr.append(); // X
arr.add(); // X
arr.insert(); // X
arr[3] = 0; // X

 

ArrayList

Java 공식문서에서 ArrayList에 대한 설명이 길어서 우선 ArrayList를 나타내는 코드를 가져왔다.

아래 코드를 보면 ArrayList는 List<E>, RandomAccess, Cloneable, Serializable을 상속한다.

이중에서 내가 아는것은 일단 List<E>이다. List를 상속한다는 뜻은 즉 List의 특징을 ArrayList가 갖게 된다는 의미이다. 

위에서 본 Hierarchy of Collection Framework 만 확인해도 List interface를 ArrayList가 상속하고 있는 것을 확인할 수 있다.

 

ArrayList는 초기화시 사이즈가 고정되고, 사이즈 변경이 불가능한 Array의 단점을 List<E> 상속으로 없앴다고 볼 수 있다.

public class ArrayList<E>
extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, Serializable

 

Array vs ArrayList

Array ArrayList
사이즈가 초기화시 고정된다. 초기화시 사이즈를 표기하지 않으며, 크기가 가변적이다.
초기화시 메모리에 할당되어 ArrayList보다 속도가 빠르다. 데이터 추가 삭제시 메모리를 재할당하기 때문에 Array보다 속도가 느리다.
사이즈 변경이 불가능하다. 추가, 삭제 기능이 있어 
사이즈 변경이 가능하다.
다차원 선언이 가능하다. 다차원 선언이 불가능하다.

 


Array vs ArrayList 어떤것을 사용해야 할까?

코드를 짜는 상황에 따라 다를 것이다. 

만약 어떤 상황에서든 고정적인 크기를 갖는 변수라면 Array를 사용하는 것이 더 좋을 것이고, 상황에따라 다르거나 가변적이라면 ArrayList를 사용하는 것이 더 좋을 것이다.

일반적으로 ArrayList를 사용하는 상황이 더 많을 것이라고 예상된다.

 

또한 ArrayList의 경우 항목을 빠르게 추가 하기 위해서 메로리의 약 2배를 할당한다. 만약 ArrayList 선언 후 항목을 추가하지 않는다면 메모리가 낭비되는 일이 발생하게 된다. 이렇게 항목이 추가될 경우가 없는 고정적인 변수가 필요한 경우에는 Array, 항목 추가가 필요한 경우는 ArrayList를 상황에 따라 사용하는 것이 적합하다.

 

728x90

'Language > JAVA' 카테고리의 다른 글

[JAVA] 생성자  (0) 2023.10.25
[JAVA] 값 복사와 주소 복사  (0) 2023.10.25
[JAVA] 테스트코드 작성하기  (1) 2023.10.24
[JAVA] 메소드 Method  (0) 2023.10.19
[JAVA] 패키지  (0) 2023.10.19

본 포스팅은 진짜 개발자 블로그의 글을 참고하여 작성하였습니다.

 

Test - Test 코드를 작성해야하는 이유와, 방법

1. 테스트코드의 중요성 1. Test Code를 왜 작성해야 하는가우선 테스트코드를 작성하기 전, 우리가 왜 TestCode를 작성해야 하는지를 먼저 알아야, 귀찮은 테스트코드를 꼭 작성하려고 할것 같습니다

galid1.tistory.com

 

테스트 코드 작성방법

public class Dog {
	public String bark(String wang) {
    	return "bark " + wang;
    }
}

위 Dog class 를 테스트한다고 가정한다.

 

1. 테스트 대상의 행위를 정한다.

Dog 객체에서 bark() 라는 메소드에 매개변수로 wang을 전달하여 호출하면 ? (행위)

 

2. 기대하는 결과를 작성

bark wang 을 반환해야 한다.

 

3. 두 문장을 결합해서 테스트 코드로 작성한다.

public class DogTest {	
	@Test
    public void bark_테스트() throws Exception {
    	// given
        String wang = "Wang Wang";
        Dog d1 = new Dog();
        
        // when
        String d1Bark = d1.bark(wang);
        
        // then
        assertTaht(d1Bark, is("bark Wang Wang"));
    }
}

테스트 코드 작성 팁

1. given, when, then

테스트 코드 작성시, 많은 곳에서 추천하는 코딩 스타일이다.

어떡값이 주어지는지, 무엇을 했을 때, 어떤 값을 원하는지를 나누어 직관적으로 볼 수 있기 때문이다.

 

2. 모든 response에 대한 테스트를 진행한다.

 

3. F.I.R.S.T

FIRST는 아래의 용어들의 약자이다.

 

F:: Fast

단위 테스트는 가능한 빠르게 실행되어야 한다.

실햄함에 있어서 너무 느려서 테스트 실행을 꺼리게 된다면 잘못된 단위 테스트이다.

 

I:: Independent

단위 테스트는 객체의 상태, 메소드, 이전 테스트 상태, 다른 메소드의 결과 등에 의존해서는 안된다.

➡️ 즉, 단위테스트는 어떤 순서로 실행하더라도 성공해야 한다.

 

R:: Repratable

단위 테스트는 반복 가능해야 한다.

 

S:: Self-validating

단위 테스트는 자체 검증이 가능해야 한다. 테스트를 개발자가 직접 수동으로 확인할 필요 없이, Assert 문 등에 의해 성공 여부가 결과로 나타나야 한다.

 

T:: Timely

단위 테스트를 통과하는 제품코드가 작성되기 바로전에 단위테스트를 작성해야 한다. 

TDD를 하고 있다면 적용이 되지만 그렇지 않을 수도 있다.

728x90

'Language > JAVA' 카테고리의 다른 글

[JAVA] 값 복사와 주소 복사  (0) 2023.10.25
[JAVA] Java Collections / Array / ArrayList  (2) 2023.10.25
[JAVA] 메소드 Method  (0) 2023.10.19
[JAVA] 패키지  (0) 2023.10.19
[JAVA] 접근 제어자  (0) 2023.10.19

+ Recent posts