• 객체의 필드값이 모두 같아야 한다면 모든 객체의 필드값을 같게 맞추는 것 보다 필드를 한 곳에 위치시키고 객체들이 그 필드를 공유하는 것이 메모리 낭비를 줄일 수 있다. 
  • 자바는 이런 경우를 위해 클래스 멤버를 인스턴스 멤버와 정적 멤버로 구분해서 선언할  수 있도록 한다.
    • 인스턴스 멤버 : 객체마다 가지고 있는 멤버
    • 정적 멤버 : 클래스에 위치시키고 객체들이 공유하는 멤버

 

인스턴스 멤버와 this

① 인스턴스 멤버

  • 객체를 생성한 수 사용할 수 있는 필드와 메소드. 각각 인스턴스 필드, 인스턴스 메소드라고 한다.
  • 인스턴스 멤버는 객체 소속된 멤버이기 때문에 객체없이 사용할 수 없다.

② 인스턴스 멤버 선언

  • 인스턴스 필드는 객체마다 따로 존재하고 힙 역역에 저장된다. 
  • 인스턴스 메소드는 메소드 영역에 저장되고 공유된다.
  • 메소드는 코드 블록이므로 객체마다 동일한 코드 블록을 가지고 있을 필요가 없기 때문!

③ this

  • 객체 내부에서 인스턴스 멤버에 접근하기 위해 this를 사용할 수 있다.
  • this는 주로 생성자와 메소드의 매개 변수 이름이 필드와 동일한 경우, 인스턴스 멤버인 필드임을 명시하고자 사용된다.

 

정적 멤버와 static

① 정적 멤버 선언

  • 정적 멤버 : 클래스에 고정된 멤버로 객체를 생성하지 않고 사용할 수 있는 필드와 메소드를 말한다.
  • 정적 필드와 정적 메소드를 선언하려면 메소드 선언 시 static 키워드를 추가적으로 붙이면 된다.
  • 정적 필드와 정적 메소드는 클래스에 고정된 멤버이므로 클래스 로더가 클래스를 로딩해서 메소드 메모리 영역에 적재할 때 클래스별로 관린된다. 
  • 따라서 클래스의 로딩이 끝나면 바로 사용할 수 있다.
  • 객체마다 가지고 있어야 할 데이터라면 인스턴스 필드로 선언하고, 객체마다 가지고 잇을 필요가 없는 공용 데이터라면 정적 필드로 선언한다. ex - Calculator 클래스에서 변하지 않는 값인 원주율 파이는 정적 필드로, 값이 변하는 color는 인스턴스 필드로 선언.
  • 메소드 역시 인스턴스 필드를 포함하고 있다면 인스턴스 메소드로 선언하고, 인스턴스 필드를 포함하고 있지 않다면 정적 메소드로 선언한다.

② 정적 멤버 사용

  • 클래스가 메모리로 로딩되면 정적 멤버를 바로 사용할 수 있는대, 클래스 이름과 함께 도트(.) 연산자로 접근한다.
    • 클래스.필드;
    • 클래스.메소드(매개값...);

③ 정적 메소드 선언 시 주의할 점

  • 객체가 없어도 실행된다는 특징 때문에 정적 메소드를 선언할 때는 이들 내부에 인스턴스 필드나 인스턴스 메소드를 사용할 수 없다.
  • 또한 자신의 참조인 this 키워드도 사용이 불가능하다.
  • 정적 메소드에서 인스턴스 멤버를 사용하고 싶다면, 객체를 먼저 생성하고 참조 변수로 접근해야 한다.

 

싱글톤(Singleton)

  • 전체 프로그램에서 단 하나의 객체만 만들도록 보장해야 하는 경우 단 하나만 생성된다고 해서 이 객체를 싱글톤이라고 한다.
  • 생성자를 외부에서 호출할 수 없도록 생성자 앞에 private 접근 제한자를 붙여 준다.
  • 그리고 자신의 타입인 정적 필드를 하나 선언하고 자신의 객체를 생서해 초기화한다.
  • 정적 필드도 private 접근 제한자를 붙여 외부에서 필드값을 변경하지 못하도록 막는다.
  • 대신 외부에서 호출할 수 있는 정적 메소드인 getInstance() 를 선언하고 정적 필드에서 참조하고 있는 자신의 객체를 리턴한다.

 

final 필드와 상수

① final 필드

  • 저장된 초기값이 최종값이므로 수정할 수 없다.
  • 초기값을 주는 방법은 필드 선언 시에 주는 방법과 생성자에서 주는 방법이 있다.
  • 만약 초기화되지 않은 final 필드를 그대로 남겨두면 컴파일 에러가 발생한다.
  • final 필드는 final 키워드로 선언한다.

 

② 상수 (constant)

  • 불변의 값을 상수라고 한다. 불변의 값은 수학에서 사용되는 원주율 파이나 지구의 무게 및 둘레 등이 해당된다.
  • final 필드는 객체마다 저장되고 생성자의 매개값을 통해서 여러 가지 값을 가질 수 있지만 상수는 불변의 값이고 공용성을 띠고 있다는 점에서 차이가 있다. 
  • 상수는 한번 초기값이 저장되면 변경할 수 없다.
  • 상수 이름은 대문자로 작성하는 것이 관례이다. 혼합된 이름이라면 (_)언더바로 단어들을 연결해준다.
  • 상수는 static final 키워드로 선언한다.

'Coding > Java' 카테고리의 다른 글

[20] JAVA 상속  (0) 2022.11.30
[19] JAVA 패키지와 접근 제한자  (0) 2022.11.29
[17] JAVA 자료구조 ArrayList  (0) 2022.11.25
[16] JAVA 메소드  (0) 2022.11.24
[15] JAVA 생성자 (Constructor)  (0) 2022.11.24

 

ArrayList

  • ArrayList는 자바의 List 인터페이스를 상속받은 여러 클래스 중 하나입니다.
  • 일반 배열과 동일하게 연속된 메모리 공간을 사용하며 인덱스는 0부터 시작합니다.
  • 배열과의 차이점은 배열이 크기가 고정인 반면 ArrayList는 크기가 가변적으로 변합니다.
  • 내부적으로 저장이 가능한 메모리 용량(Capacity)이 있으며 현재 사용 중인 공간의 크기(Size)가 있습니다.
  • 만약 현재 가용량(Capacity) 이상을 저장하려고 할 때 더 큰 공간의 메모리를 새롭게 할당합니다.

1. ArrayList 생성

ArrayList<Integer> integers1 = new ArrayList<Integer>(); // 타입 지정
ArrayList<Integer> integers2 = new ArrayList<>(); // 타입 생략 가능
ArrayList<Integer> integers3 = new ArrayList<>(10); // 초기 용량(Capacity) 설정
ArrayList<Integer> integers4 = new ArrayList<>(integers1); // 다른 Collection값으로 초기화
ArrayList<Integer> integers5 = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5)); // Arrays.asList()
  • 보통 생성할 때는 new ArrayList<>()와 같이 타입을 생략해서 작성합니다.
  • ArrayList를 생성할 때 Set이나 다른 ArrayList를 전달하면 해당 Collections의 값들로 초기화됩니다.
  • 마지막으로 가변 인자를 전달받는 Arrays.asList()를 사용하면 기본 값들로 생성 가능합니다.

 

2. ArrayList  추가/변경

ArrayList<Integer> list = new ArrayList<>();

list.add(1); // 1 삽입
list.add(3);
list.add(1, 2); // 	index 1에 2 추가

System.out.println(list);
  • ArrayList를 생성한 후 add() 메소드로 엘레멘트를 추가할 수 있습니다.
  • 또한 set() 메소드로 기존에 추가된 값을 변경하는 것도 가능합니다.
  • add()는 기본적으로 리스트의 가장 끝에 값을 추가합니다.
  • 별도로 인덱스를 지정하면 해당 인덱스에 값이 추가되고 그 인덱스부터의 값들이 1 칸씩 밀립니다.

 

3. ArrayList 삭제

list.remove(2); // 2번 인덱스 삭제 => remove(index)
list.clear(); // 리스트의 모든 값 삭제

list.remove(list.indexOf(2)); // 리스트에 2를 포함한 인덱스 리턴 후 삭제
  • 추가했던 값을 삭제할 때는 remove() 메소드를 호출합니다.
  • 삭제할 때는 엘레멘트의 인덱스를 입력하거나 엘레멘트를 직접 입력할 수 있습니다.
  • 인덱스를 통해 삭제할 경우 삭제되는 엘레멘트를 리턴받을 수 있습니다.
  • 값을 지움과 동시에 해당 값으로 별도의 작업이 필요한 경우 리턴을 받아서 사용하면 됩니다.
  • ArrayList 안의 내용을 전체 삭제할 때는 clear()를 호출하면 됩니다.

 

4. ArrayList 전체 값 확인

System.out.println(list); // 리스트 전체 출력
System.out.println(list.get(2)); // 2번 인덱스 출력

for(int i : list) { 
    System.out.println(i);
}

Iterator iter = list.iterator(); // 반복자 사용
while(iter.hasNext()){
    System.out.println(iter.next()); 
}
  • for-each 반복문으로 각각의 값을 순회해서 출력하는 것이 가능합니다.
  • 또한 get() 메소드로 각 인덱스의 값을 순차적으로 탐색하는 방법도 가능합니다.
  • 그리고 iterator나 listIterator를 통해 값들을 순회하는 것도 가능합니다.
  • listIterator의 경우 생성 시 ArrayList의 크기를 입력해주고 역방향으로 출력할 수 있습니다.

 

5. 값 존재 유무 확인

int index = list.indexOf(2); // 원하는 값의 인덱스를 리턴, 없으면 -1 리턴
boolean b = list.contains(2); // 원하는 값의 존재 유무

while(list.indexOf(2) == -1) { // 리스트에 원하는 값 모두 삭제
	list.remove(list.indexOf(2));
}
  • 먼저 값이 존재하는지만 알고 싶은 경우 contains()를 사용합니다.
  • 값이 존재할 때 어느 위치에 존재하는지 알고 싶은 경우 indexOf()를 사용할 수 있습니다.
  • contains()는 값이 있는 경우 true를, 값이 없는 경우 false를 리턴합니다.
  • indexOf()는 값이 존재하는 경우 해당 엘레멘트의 인덱스를 리턴합니다. 값이 존재하지 않을 경우 -1을 리턴하기 때문에 별도로 처리가 가능합니다.

'Coding > Java' 카테고리의 다른 글

[19] JAVA 패키지와 접근 제한자  (0) 2022.11.29
[18] JAVA 인스턴스(객체) Instance  (0) 2022.11.27
[16] JAVA 메소드  (0) 2022.11.24
[15] JAVA 생성자 (Constructor)  (0) 2022.11.24
[14] JAVA Math 클래스 메소드  (0) 2022.11.23

메소드 : 객체의 동작에 해당하는 중괄호{} 블록

메소드 선언은 선언부(method signature)와 실행블록으로 구성된다. 

선언부와 실행블록은 다음 요소를 포함한다.

 

https://livebook.manning.com/concept/java/method-signature

 

  • 리턴타입 : 메소드가 리턴하는 결과의 타입을 표시
  • 메소드 이름: 메소드의 기능이 드러나도록 식별자 규칙에 맞게 이름을 지어준다.
  • 매개 변수 선언 : 메소드를 실행할 때 필요한 데이터를 받기 위한 변수를 선언한다.
  • 메소드 실행 블록 : 실행할 코드를 작성

 

메소드 선언

메소드 선언은 선언부(리턴 타입, 메소드 이름, 매개 변수 선언)와 실행 블록으로 구성된다.

 

① 리턴 타입

  • 리턴값의 타입을 의미한다. 리턴값이란 메소드를 실행한 후의 결과값을 의미한다.
  • 메소드는 리턴값이 있을 수도 있고 없을 수도 있으나, 리턴값이 있을 경우 리턴 타입이 선언부에 명시되어야 한다.
  • 리턴값이 없는 경우 - void powerOn(){...}
  • 리턴값이 있는 경우 - double divide(int x, int y){...}

 

② 메소드 이름

  • 숫자로 시작하면 안되고, $와 _를 제외한 특수 문자를 사용하지 말아야 한다.
  • 관례적으로 소문자로 작성하고, 혼합된 이름이라면 뒤이어 오는 단어의 첫 글자는 대문자로 작성한다.

 

③ 매개 변수 선언

  • 메소드가 실행할 때 필요한 데이터를 외부로부터 받기 위해 사용된다.
  • 메소드에서 매개 변수가 필요한 경우가 있고 필요 없는 경우가 있다.
  • 예를 들면 , powerOn() 메소드는 매개 변수가 필요 없고, divide()메소드는 나눠줘야 할 숫자타입의 변수가 필요하다.

 

④ 매개 변수의 개수를 모를 경우

  • 매개 변수를 배열 타입으로 선언하는 방법이 있다.
  • 예를 들어, 여러 개의 수를 모두 합산하는 메소드를 선언해야 하는 경우가 있는데,
  • 아래의 예제를 통해 매개 변수를 배열로 선언하는 방법을 확인해 보자.

 

  • int sum1(int[] values){...}
  • int sum2(int...values){...}

 

리턴(Return)문

① 리턴값이 있는 메소드 

② 리턴값이 없는 메소드 : void

  • 이 경우 return문은 리턴값을 지정하는 것이 아니라 메소드 실행을 강제 종료 시키는 역할을 한다.

 

메소드 호출

① 객체 내부에서 호출

   이때 변수 타입은 메소드 리턴 타입과 동일하거나, 자동 타입 변환이 될 수 있어야 한다.

 

② 객체 외부에서 호출

  • 외부 클래스에서 메소드를 호출하려면 다음과 같이 클래스로부터 객체를 생성해야 한다.
  • 메소드는 객체에 소속된 멤버이므로 객체가 존재하지 않으면 메소드도 존재하지 않기 때문

클래스 참조변수 = new 클래스(매개값,...);

 

  • 객체가 생성되었다면 아래와 같이 메소드를 호출할 수 있다.

참조변수.메소드(매개값...);

타입 변수 = 참조변수.메소드(매개값,...);

 

 

메소드 오버로딩

  • 클래스 내에 같은 이름의 메소드를 여러개 선언하는 것을 메소드 오버로딩(overloading)이라고 한다.
  • 오버로딩된 메소드를 호출할 겨우 JVM은 매개값의 타이블 보고 메소드를 선택한다.
  • 주의점은 매개 변수의 타입과 개수, 순서가 똑같을 경우 매개 변수 이름이 다르다고 해서 이것을 메소드 오버로딩이라고 하지 않는다는 것.
  • 또한 리턴 타입만 다르고 매개 변수가 동일하다면 이것도 오버로딩이 아니다.
  • 오버로딩의 대표적인 예 - System.out.println() 메소드. - 매개값의 타입에 따라 오버로딩된 println() 메소드 중 하나를 호출한다.

  • 위와 같이 오버로딩된 메소드의 경우, 매개값의 개수에 따라 어떤 메소드가 호출될 것인지 결정된다.

 

 

'Coding > Java' 카테고리의 다른 글

[18] JAVA 인스턴스(객체) Instance  (0) 2022.11.27
[17] JAVA 자료구조 ArrayList  (0) 2022.11.25
[15] JAVA 생성자 (Constructor)  (0) 2022.11.24
[14] JAVA Math 클래스 메소드  (0) 2022.11.23
[13] JAVA String 클래스 메소드 정리  (0) 2022.11.23

생성자 :

  • new 연산자로 클래스로부터 객체를 생성할 때 호출되어 객체의 초기화를 담당. 
  • new 연산자로 호출되는 중괄호{} 블록이다.
  • 모든 클래스에 반드시 하나 이상 존재한다. 따라서 클래스 내부에 선언을 생략하면 자동으로 추가된다.

객체 초기화 : 필드를 초기화 하거나 메소드를 호출해서 객체를 사용할 준비를 하는 것. 

 


① 기본 생성자

  • 모든 클래스는 생성자가 반드시 존재하고 하나 이상의 생성자를 가질 수 있다.
  • 만약 클래스 내부에 생성사 선언을 생략했다면 컴파일러는 기본생성자를 바이트 코드에 자동 추가한다.

 

② 생성자 선언

  • 생성자는 메소드와 비슷한 모양을 가지고 잇지만, 리턴 타입이 없고 클래스 이름과 동일하다.
  • 매개 변수 선언은 생략할 수도 있고 여러 개를 선언해도 된다.
  • 클래스에 생성자가 명식적으로 선언되어 있을 경우, 반드시 선언된 생성자를 호출해서 객체를 생성해야 한다.

 

https://cloudstudying.kr/lectures/197

 

  • 아래 예제를 보면 Car 클래스에 생성자 선언이 있기 때문에 기본생성자 Car(())를 호출해서 객체를 생성할 수 없고, Car(String color, int cc)를 호출해서 객체를 생성해야 한다.
  • 따라서 형식을 지키지 않는다면, 다음과 같은 메세지를 확인 할 수 있다.

 

Expeceted 2 arguments but found 0 이라는 경고 메시지를 확인할 수 있다.

 

 

③ 필드 초기화

  • 클래스로부터 객체가 생성될 떄 필드는 기본 초기값으로 자동 설정된다.
  • 만약 다른 값으로 초기화 하고 싶다면, 필드를 선언할 때 초기값을 주거나 아니면 생성자에 초기값을 주는 방법이 있다.
  • 필드를 선언할 때 초기값을 주게 되면 동일한 클래스로부터 생성되는 객체들은 모두 같은 값을 갖게 된다.
  • 만약 객체 생성 시점에 외부에서 제공되는 다양한 값들로 초기화 되어야 한다면, 생성자의 매개값들을 초기화 해줘야 한다.
  • 필드와 매개변수의 이름이 동일한 경우 필드 앞에 this를 붙여준다. 
  • this는 객체 자신의 참조인데, 'this.필드'는 this라는 참조 변수로 필드를 사용하는 것이다.

 

④ 생성자 오버로딩 (overloading)

  • 매개 변수를 달리하는 생성자를 여러 개 선언하는 것을 의미
  • 주의할 점은 매개 변수의 타입과 개수 그리고 선언된 순서가 똑같을 경우 매개 변수 이름만 바꾸는 것은 생성자 오버로딩이 아니라는 것
  • https://www.geeksforgeeks.org/constructor-overloading-java/?ref=gcse (참고자료)

 

필드 부분
생성자 오버로딩

 

 

⑤ 다른 생성자 호출 : this()

  • 생성자 오버로딩이 많아질 경우 생성자 간의 중복된 코드가 발생할 수 있다.
  • 이 경우 필드 초기화 내용은 한 생성자에만 집중적으로 작성하고 나머지 생성자는 초기화 내용을 가지고 있는 생성자를 호출하는 방식으로 개선할 수 있다.
  • 생성자에서 다른 생성자를 호출할 때에는 this()코드를 사용한다.
  • this()자신의 다른 생성자를 호출하는 코드로 반드시 생성자의 첫 줄에서만 허용된다.

 


참고하면 좋을 자료

https://cloudstudying.kr/lectures/197

 

10 생성자 호출과 정의 | CloudStudying

# 생성자(constructor) 호출과 정의 ## 들어가며.. --- 붕어빵 틀로 붕어빵을 찍어내는 마법 같은 매직! ![클라우드스터딩-자바-생성자-호출-인스턴스화-constructor][Imgur](https://i.imgur.com/dl4KpzQ.png) 클래스

cloudstudying.kr

 

'Coding > Java' 카테고리의 다른 글

[17] JAVA 자료구조 ArrayList  (0) 2022.11.25
[16] JAVA 메소드  (0) 2022.11.24
[14] JAVA Math 클래스 메소드  (0) 2022.11.23
[13] JAVA String 클래스 메소드 정리  (0) 2022.11.23
[12] JAVA 예외처리  (0) 2022.11.23

 

대표적인 Math 메소드

static double random() 0.0 이상 1.0 미만의 범위에서 임의의 double형 값을 하나 생성하여 반환함.

예시 - 주사위 번호 뽑기

int num = (int)(Math.random() * 6 ) + 1; 

정수 1부터 6까지 랜덤으로 수를 반환
static double abs(double a)
static double abs(float a)
static double abs(int a)
static double abs(long a)
전달된 값이 음수이면 그 값의 절댓값을 반환하며, 전달된 값이 양수이면 인수를 그대로 반환함.
static double ceil(double a) 전달된 double형 값의 소수 부분이 존재하면 소수 부분을 무조건 올리고 반환함.
static double floor(double a) 전달된 double형 값의 소수 부분이 존재하면 소수 부분을 무조건 버리고 반환함.
static long round(double a)
static int round(float a)
전달된 값을 소수점 첫째 자리에서 반올림한 정수를 반환함.
static double rint(double a) 전달된 double형 값과 가장 가까운 정수값을 double형으로 반환함.
static double max(double a, double b)
static float max(float a, float b)
static long max(long a, long b)
static int max(int a, int b)
전달된 두 값을 비교하여 큰 값을 반환함. 최댓값
static double min(double a, double b)
static float min(float a, float b)
static long min(long a, long b)
static int min(int a, int b)
전달된 두 값을 비교하여 작은 값을 반환함. 최솟값
static double pow(double a, double b) 전달된 두 개의 double형 값을 가지고 제곱 연산을 수행하여, ab을 반환함.
static double sqrt(double a) 전달된 double형 값의 제곱근 값을 반환함.
static double sin(double a)
static double cos(double a)
static double tan(double a)
전달된 double형 값에 해당하는 각각의 삼각 함숫값을 반환함.
static double toDegrees(double angrad) 호도법의 라디안 값을 대략적인 육십분법의 각도 값으로 변환함.
static double toRaidans(double angdeg) 육십분법의 각도 값을 대략적인 호도법의 라디안 값으로 변환함.

'Coding > Java' 카테고리의 다른 글

[16] JAVA 메소드  (0) 2022.11.24
[15] JAVA 생성자 (Constructor)  (0) 2022.11.24
[13] JAVA String 클래스 메소드 정리  (0) 2022.11.23
[12] JAVA 예외처리  (0) 2022.11.23
[11] JAVA String, StringBuilder 클래스  (0) 2022.11.22

+ Recent posts