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

본 포스팅은 개발하는 주디씨 블로그의 글을 참고하여 작성하였습니다.

 

[Java] 프로젝트, 패키지, 메소드, 클래스 네이밍 규칙

다들 자바 프로젝트를 하면서 한번 쯤은 혹은 여전히 고민하고 계실 네이밍 규칙 Tip을 공유합니다. 공통 대소문자가 구분되며 길이에 제한이 없다. 예약어를 사용해서는 안 된다. 숫자로 시작해

printf-hellojudyworld.tistory.com

 

공통 

  • 대소문자가 구분되며 길이에 제한이 없다.
  • 예약서 사용 X
  • 숫자로 시작하면 안된다.
  • 특수문자는 '_' 또는 '$'만 사용 가능하다.
  • 반의어는 반드시 대응하는 개념으로 사용해야 한다.

 

Project 프로젝트

  • 대/소문자 구분 없이 시작 가능하다.
  • 대문자 사용을 권장한다.

 

Class 클래스

  • 명사로 작성한다.
  • 대문자로 시작한다.
  • Pascal Case를 사용한다. ➡️ 여러 개의 단어를 조합하여 작성하는 경우 각 단어의 첫 번째 글자는 대문자로 한다.
class Cake() {}
class BananaCake() {}

 

Interface 인터페이스

  • Pascal Case를 사용한다.
  • 형용사를 사용한다.

 

Method 메서드

  • 동사로 작성한다.
  • 소문자로 시작한다.
  • Camel Case를 사용한다. ➡️ 여러 개의 단어를 조합하여 만들 경우 맨 첫 글자를 제외한 나머지 단어의 첫 글자는 대문자를 사용하여 구분한다.
eat();
eatCake();
getPrice();

 

  1. 속성에 접근하는 메서드 명의 접두사는 "set" , "get"을 사용한다.
  2. 데이터를 조회하는 메서드 명은 접두사 find를 사용한다.
  3. 데이터를 입력하는 메서드 명의 접두사는 input을 사용한다.
  4. 데이터를 삭제하는 메서드 명의 접두사는 delete를 사용한다.
  5. 데이터를 초기화하는 메서드 명의 접두사는 initialize를 사용한다.
  6. 반환 값의 타입이 boolean인 메서드의 접두사는 is를 사용한다.
  7. 데이터를 불러오는 메서드의 명은 접두사 laod를 사용한다.
  8. 데이터가 있는지 확인하는 메서드명의 접두사는 has를 사용한다.
  9. 새로운 객체를 만든 뒤 해당 객체를 리턴해주는 메서드 명의 접두사는 create를 사용한다.
  10. 해당 객체를 다른 형태의 객체로 변환해주는 메서드 명의 접두사는 to를 사용한다.
  11. 해당 객체가 복수인지 단일인지 구분하는 메서드의 접미사는 s를 사용한다.
  12. B를 기준으로 A를 하겠다는 메소드명의 전치하는 By를 사용한다.

 

Package 패키지

  • 패키지명은 대소문자 모두를 허용하지만 소문자로 하는 것을 원칙으로 한다.
  • 표준 패턴을 따른다. 
    • ex) [com].[Company].[Project].[toppackage].[lowerpackage]
  • 가급적 한 단어 사용을 권장한다.

 

Variable 변수

  • 소문자로 시작한다.
  • Camel Case를 사용한다.
  • 의미가 있는 이름으로 작성하여 변수명만 봐도 사용한 이유를 알 수 있게 지어야 한다.
  • 순서를 의미하고 임시로 쓰이는 정수의 변수명은 i, j, k, m, n을 사용한다. 문자의 경우 c, d, e등을 사용한다.
  • 변수명에 _, $를 사용할 수 있자만 시작 문자로 사용하는 것은 지양한다.
String userName;
int userAge;
int i ; // 주로 반복문에서 사용한다.
char c; // 주로 반복문에서 사용한다.

 

Constant 상수

  • 전부 대문자로 작성한다.
  • Snake Case를 사용하여 '_'로 구분한다.
int MAX_DEPTH = 100;
int MIN_DEPTH = 1;

 

728x90

메소드

메소드를 처음 본 사람에게 가장 쉬운 비교 대상은 함수(function)이다. 사실 자바의 메소드는 형태적으로는 함수와 동일하며, 기능도 함수이기 때문이다. 

 

메소드의 구조

메소드는 리턴 타입, 메소드 이름, 매개변수 목록과 같이 세 가지 요소로 구성된다. 그리고 이 세 개의 요소를 합쳐서 메소드 시그니처라고 한다.

리턴타입 메소드이름(매개변수 목록) {
	// 메소드의 기능(로직);
    return 메소드 실행 결과;
}

 

리턴 타입

리턴 타입은 메소드가 리턴할 데이터에 대한 타입 선언이다. 메소드는 반드시 리턴 타입으로 선언한 데이터를 리턴해야 한다. 만약 데이터를 리턴하지 않거나 선언한 타입과 다른 타입의 데이터를 리턴하면 에러가 발생한다. 

 

만약 메소드가 아무것도 리턴하지 않는다면 리턴 타입을 void로 선언해야 한다. void는 리턴값이 없는 메소드를 선언할 때 사용하는 예약어이다.

 

메소드 이름

메소드 이름은 변수 이름 규칙과 동일한 규칙을 적용하여 선언한다. 중요한 것은 메소드 이름은 메소드가 제공하는 기능을 어느 정도 유추할 수 있게 지어야 한다는 것이다. 

메소드 이름의 길이는 제한이 없으므로 충분히 기능을 유추할 수 있는 적절한 길이의 이름을 사용하는 것이 바람직하다.

 

매개변수

메소드는 매개변수를 통해 외부로부터 메소드의 기능을 수행하는 데 필요한 데이터를 받아들인다. 물론 외부로부터 데이터를 받지 않고 멤버 변수만으로 기능을 처리할 수도 있다. 당연히 이런 경우에는 매새변수를 선언하지 않는다.

 

매개변수는 로컬 변수에 해당하므로 멤버 변수와 달리 메소드가 호출될 때 메모리에 올라간다. 그리고 메소드 수행이 종료되는 순간 곧바로 삭제된다. 매개변수 개수는 적을수록 좋다. 매개변수가 많으면 메소드를 호출할 때마다 매개변수의 개수와 타입을 신경 써야 하기 때문이다.

 

메소드 유형

메소드의 유형은 너무나 다양하지만 크게 두 가지 기준으로 나누면 다음과 같다.

  • 매개변수의 유무
  • 리턴 타입의 유무

 

매개변수의 유무

매개변수가 없는 메소드는 두 가지 형태가 있다. 첫 번째는 자체적으로 변수를 선언하여 사용하는 메소드가 있고, 두 번째는 오직 멤버 변수만을 사용하여 기능을 처리하는 메소드가 있다.

 

리턴 타입 유무

메소드를 구분하는 두 번째 기준은 리턴 타입의 유무다. 

 

Getter/Setter 메소드

자바로 프로그램을 개발하다 보면 클래스의 멤버 변수를 private으로 선언하고 멤버 변수에 접근하여 처리하는 public 메소드가 필요한 경우가 있다.

 

private 멤버 변수에 값을 할당하는 메소드를 Setter 메소드라고 하고, private 멤버 변수에 할당된 값을 리턴한느 메소드를 Getter메소드라고 한다. 그리고 이 둘을 합쳐서 Getter/Setter 라고 한다. 

 

메소드 오버로딩

자바는 하나의 클래스에 이름이 같은 메소드를 여러 개 선언할 수 있는데, 이를 메소드 오버로딩(overloading) 또는 메소드 중복 정의라고 한다.

 

이름이 같은 메소드는 매개변수를 통해서 식별한다.

메소드 이름이 동일해도 매개변수의 개수와 타입이 다르면 메소드를 호출할 때 매개변수의 개수와 타입을 통해 정확하게 원하는 메소드를 호출할 수 있다. 

// 1 
int printAvg(int javaScore, int pythonScore) {
	return (javaScore + pythonScore)/2;
}

// 2
int printAvg(int javaScore, int pythonScore, int sqlScore) {
	return (javaScore + pythonScore + sqlScore)/3;
}

1과 2 는 매개변수의 개수가 다르기 때문에 오버로딩이다.

 

728x90

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

[JAVA] Java Collections / Array / ArrayList  (2) 2023.10.25
[JAVA] 테스트코드 작성하기  (1) 2023.10.24
[JAVA] 패키지  (0) 2023.10.19
[JAVA] 접근 제어자  (0) 2023.10.19
[JAVA] 클래스 Class (3)  (0) 2023.10.18

+ Recent posts