JAVA

23-01-13 수업내용 정리

모건이삼촌 2023. 1. 15. 12:45

2023-01-13 09:30 ~ 18:30 수업진행

 

※ 수업내용

 

4. 배열 복사

한번 생성된 배열 객체는 개수를 늘리거나 줄일 수 없어, 새로운 배열을 생성해 값들을 복사해서 옮겨야 한다.

배열을 복사하는 방법은 3가지가 있는데

첫번째는 for문을 이용한 방법

두번째는 System.arrayCopy()를 이용한 방법

세번째는 Arrays 클래스를 이용하는 방법이 있다

 

아래 예제를 보자.

package chapter6;

import java.util.Arrays;

public class ArrEx13 {
	
	public static void main(String[] args) {
		
		//원본 배열
		int[] arrInt = {1,2,3};
		
		//복사할 배열 {0,0,0,0,0}
		int[] arrInt2 = new int[5];
		
		System.arraycopy(arrInt, 0, arrInt2, 2, arrInt.length);
		
		//복사할 배열에 값 대입
		for (int i=0; i<arrInt.length; i++) {
			
//			arrInt2[i] = arrInt[i];
		}
		
		//배열 값 출력
		arrInt = arrInt2; // 주소값을 덮어쓰면 깔끔하게 코딩할 수 있다.
		System.out.println(Arrays.toString(arrInt));
		System.out.println(Arrays.toString(arrInt2));
		for (int i=0; i<arrInt2.length; i++) {
			System.out.println(arrInt2[i]);
		}
			
	}

}

실행 결과

1) for문을 이용한 방법

arrInt변수는 1, 2, 3 세개의 정수값이 들어있는 배열인데 2개의 자리가 더 필요해서 길이가 5인 arrInt2라는 변수를 생성했다.

arrInt2의 3, 4번 인덱스는 대입되지 않아 arrInt를 출력해보면 3, 4번 인덱스는 정수타입의 기본값인 0으로 출력된다.

 

2) System.arrayCopy()를 이용한 방법

위 예제에는 System.arraycopy 메서드가 있는데 괄호 안에 ,(컴마)를 구분으로 총 5개의 변수 또는 리터럴 값이 있다.

이것을 매개변수라고 하는데, arraycopy() 메서드에 값을 전달해주는 역할을 한다.

첫번째 매개변수는 원본 배열이,

두번째는 복사할 시작 인덱스값,

세번째는 복사할 대상이 되는 배열

네번째는 대상 배열의 복사위치 시작 인덱스,

마지막 5번째는 복사할 길이를 넣어준 것이다.

정리하자면 arrInt의 0번 인덱스부터 복사하는데, 대상은 arrInt2 2번의 인덱스 부터 값을 넣어주고 복사할 길이는 arrInt의 길이 3개만큼 복사하게 된다. 그래서 실행값은 0, 1은 기본값 0이 2번 인덱스부터 3개의 값이 1, 2, 3으로 출력된다.

 

5. 향상된 for문

향상된 for문은 간편하게 사용할 수 있으나, 값을 읽을수만 있고, 변경할 수 없다. 또한 인덱스를 사용할 필요가 없어 오히려 불편할 때가 있다. 

아래 예제를 보자.

package chapter6;

public class ArrEx16_1 {
	
	public static void main(String[] args) {
		
		// 배열
		int[] arrInt = {11,22,33,44,55};
		
		//기존 for문을 이용한 출력
		for (int i=0; i<arrInt.length; i++) {
			System.out.println(arrInt[i]);
		}

		// 향상된 for문을 이용한 출력
		for (int number : arrInt) {
//			 :기준으로 오른쪽엔 반복할 대상을 넣는다.
			System.out.println(number);
		}

	}

}

실행 결과

향상된 for문은 for문 괄호 안에 변수가 선언 되어 있고 : 뒤에 반복 가능한 배열이 있다.

이 배열의 첫번째 요소부터 차례대로 변수 number에 대입되는 것이다. for문은 이처럼 반복하면서 배열처럼 여러 값들을 하나의 실행문으로 처리하기 위해 많이 사용되는대, 굳이 인덱스가 따로 필요없는 경우 사용하면 편하다.

 

6. 참조자료형

자바에서의 데이터 타입은 기본자료형과 참조자료형으로 나누어 진다.

기본자료형은 정수, 실수, 논리 자료형의 리터럴 값을 저장하는 타입인데, 우리는 지금까지 대부분 기본자료형으로 예제들을 살펴봤다.

참조자료형(Reference Type)은 리터럴값을 직접 갖고 있는 것이 아니라 값이 저장된 위치의 주소를 참조하는 변수를 말한다.

참조자료형은 위에서 배운 배열이나, 클래스, 인터페이스가 이에 해당된다.

 

 

★ 클래스

 

1. 객체지향 프로그래밍

객체지향 프로그래밍 (Object Oriented Programming)을 줄여서 OOP라고 부른다.

이름을 붙일 수 있는 모든 카테고리는 "객체" 이다.

한마디로 주위 모든 사물을 뜻하는 객체라는 개념을 프로그래밍에 도입해서 실제 세상에서 사물의 속성과 기능, 사물간의 관계를 컴퓨터 프로그램에서도 사용할 수 있게 프로그래밍하는 방법이다.

객체지향 프로그래밍은 객체간에 독립적이기 때문에, 수정이나 추가사항에 대한 작업이 수월하고, 객체들간의 관계를 파악하면 되게 때문에 소프트웨어 설계측면에서 보다 직관적으로 분석이 가능하다. 무엇보다 프로그래밍을 수년간 전공지식을 쌓거나 특별한 능력이 있는 사람만이 하는 것이 아닌 초보자들도 쉽게 배울 수 있는 언어로 사람들에게 인식되어진 계기가 되었다.

 

객체지향 프로그래밍 언어의 특징

 가. 상속(일반화)

 나. 다형성

 다. 추상화

 라. 캡슐화

 

 1) 상속 (Inheritance)

상속은 일상 생활에서 사용하고 있는 상속이라는 말과 비슷하다. 부모의 재산을 자식에게 물려 주듯이 객체지향 프로그래밍에서도 부모가 가지고 있는 여러 속성과 기능들을 자식이 그대로 물려받을 수 있게 된다.

그래서 자식들은 똑같은 코드를 중복해서 작성할 필요가 없으므로, 반복된 코드의 중복을 줄여준다.

다만 위에 개념에 대해서 추가하자면 부모는 자식을 모르는데 자식은 부모를 안다.

 

 2) 다형성 (Polymorphism)

다형성은 다양한 모양(타입)을 갖는 성질(특성) 이다. 

부모 / 자식간의 관계가 있는 클래스는 자식이 부모의 타입으로 변환이 가능하다.

간단한 예를 들어보자면

컴퓨터 메인보드에는 그래픽카드를 꽃을 수 있는 슬롯이 있다.

최근의 메인보드는 다 똑같은 슬롯들 가지고 있는데, 이 슬롯에 꽃을 수 있는 그래픽카드를 부품화 하여 여러 제조사의 다양한 그래픽카드를 슬롯에 맞게 구현하면 어떤 그래픽 카드도 다 꽃을 수 있게된다.

다양한 형태의 그래픽카드를 모두 합쳐서 그래픽카드 라고 부르지만 실제 동작하는 방식은 각각의 그래픽카드마다 다르다.

이처럼 동일한 메시지(그래픽 카드)에 대하여 다르게 반응하는 (그래픽카드마다 다르게 동작)것을 다형성 이라고 한다.

 

 3) 추상화 (Abstraction)

추상화는 사물에서 속성이나 특징들을 추출하는 것을 의미한다.

반댓말로는 구체화 이다.

 

 4) 캡슐화(Encapsulation)

캡슐화는 객체의 실제 기능들을 숨겨서 감춰놓는것을 말한다.

캡슐화의 의미는 크게 두가지로 나눌 수 있는데,

하나는 관련있는 속성이나 기능들을 객체 내부에 숨겨놓고 외부에서 불필요한 정보를 볼 수 없도록 해서 객체 내부에 문제가 생기지 않도록 보호하며 꼭 필요한 속성이나 기능만 외부로 노출하는 것이다. 이를 정보은닉 (hiding information)이라고 한다.

간단한 예를 들자면 알약을 먹을 때 먹으면 어떤 효과가 있는지 알지만 알약 속에 구체적으로 어떤 성분이 들어있는지 모르는것 이것을 캡슐화 라고 한다.

 

2. 클래스와 객체

클래스와 객체를 한마디로 정리하자면 클래스는 설계도, 객체는 이 설계도로 만들어진 피조물 이다.

클래스 자체만으로 구체화 될 수 없고, 객체를 생성하기 위해 미리 설계도를 만들어 놓고, 이 설계도를 가지고 실제 객체를 만들게 되는 것이다.

자바에서 클래스(설계도)를 만들고 객체(피조물)을 생성하는 법을 알아보자.

클래스와 객체

처음에 배웠던 변수를 선언하고 초기화했던 방법과 동일하다.

변수명 앞에 클래스명이 오는데, 이 클래스명이 데이터 타입 즉 자료형이 되는것이다.

이렇게 클래스를 이용해 객체를 생성하는 것을 인스턴스(instance)화 한다고 표현한다.

내가 직접 만든 클래스를 타입으로 지정 할 수 있는데 이를 사용자 정의 자료형이라고 한다.

사용자정의 자료형도 참조 자료형중 하나이므로 new 연산자로 생성된 모든 객체는 참조자료형이 된다.

 

아래 예제를 만들어보자.

package chapter07;

public class Member {
	String id;
	int age;
}

 

자바에서는 클래스가 곧 파일이 되므로 반드시 파일명도 Member.java라고 만들어야 한다.

지금은 내용이 비어있는 클래스지만 이 설계도로 객체를 생성해보도록 하겠다.

아래 예제를 만들어보자.

 

package chapter7;

public class MemberMain {

	public static void main(String[] args) {
		// new : 인스턴스 생성
		// new : 생성자를 호출해 힙 영역에 필드(클래스가 가지고있는 변수)를 초기화 후 주소를 확보해 반환하는 연산자 (아직은 몰라도 됨)
//		
		
		
		Member m = new Member(); 	// 인스턴스화가 끝나야만 사용할 준비가 완료됨
		Member m2 = new Member();
		
		if (m == m2) {
			System.out.println("m객체와 m2객체는 같다.");
		} 
		else {
			System.out.println("m객체와 m2객체는 같지 않다.");
		}

	}

}

결과 출력

Member 타입의 m과 m2라는 변수를 생성하고 new연산자를 통해 생성한 객체를 대입했다.

m, m2변수 모두 객체변수로 같은 자료형 이지만 저장된 주소값은 다르다.

그래서 m == m2 비교연산의 결과는 false가 된 것을 알 수 있다. 즉 서로 독립된 다른 객체라는 것이다.

이 부분이 객체에 대한 개념중에 기초적이지만 아주 중요한 개념이다.

 

3. 클래스의 구조

클래스는 크게 속성과 기능으로 나눌 수 있다. 속성은 클래스가 가지고 있는 특징, 변수로 표현하고, 기능은 메서드라고 표현한다. 클래스의 구조를 조금 더 세분화 하면 필드(Field), 생성자 (변형 / Constructor), 메서드(Method)로 이루어진 구조이다.

이 클래스를 구성하는 각각의 멤버들은 생략될 수도 있고, 여러개로 작성할 수 있다.

 

 1) 필드

필드는 객체의 특징이나, 특성값을 저장하는 곳이다.

클래스안에 있는 변수라고 생각하면 쉽게 이해 할 수 있다.

하지만 생성자나 메서드 안에 있는 변수와는 다르다. 생성자와 메서드 안의 변수(지역변수)는 그 안에서만 사용되지만 필드는 클래스 내부의 전체에서 사용된다.

 

 2) 생성자

생성자는 말 그대로 객체를 생성할 때 사용되는 부분으로 메서드와 비슷하게 생겼지만, 클래스명과 이름이 같고, 리턴값이 없다.

 

 3) 메서드

메서드는 객체의 기능에 해당하는 영역으로 특정 기능 단위로 묶어 하나의 메서드로 정의되어 있다.

프로그램이 실행되는 곳에서 이 메서드로 값을 전달하고 메서드는 전달받은 값을 처리하거나 기능을 실행한 후 처리 결과를 실행한 곳으로 돌려주기도 한다.

 

 4) 자료구조적인 개념의 클래스

클래스를 자료구조적인 개념으로 생각해보면 데이터와 기능이 합쳐진 것이라고 볼 수 있다.

대표적인 예로 자바에서 문자열을 정의할 때 사용했던 String이라는 클래스가 있다.

이 String 클래스 자료형은 단순히 여러 문자들을 배열처럼 나열한 자료구조가 아니라 클래스로 정의되어 있는 이유는 문자열 데이터 값과 문자열을 다양하게 처리할 수 있는 기능도 포함되어 있기 때문이다.

 

 5) 자료형적인 개념의 클래스

자료형(데이터타입)적인 개념을 클래스는 이미 만들어진 자료형이 아니라 사용자가 직접 정의한 자료형으로 표현할 수 있다. 그래서 사용자 정의 자료형이라고도 부른다.

아래 예제를 보자.

 

package chapter7;

public class TV {

	boolean power;
	int chanel;
	int volum;
	
	void power() {
		power = !power;
	}
	void chanelUp() {
		chanel++;
	}
	void chanelDown() {
		chanel--;
	}
	void print() {
		System.out.println("현재 TV의 전원은 " + (power ? "켜" :"꺼" )+ "져있습니다.");
		System.out.println("TV의 채널은 " + chanel + "입니다");
	}
}

이 TV클래스도 main()메서드가 없다. 이 클래스는 실행하기 위한 클래스가 아니라 다른 클래스에서 실행에 필요한 기능을 제공하는 클래스 이다. 이 TV클래스를 이용해 객체를 생성하는 예제를 살펴보자.

package chapter7;

public class TVMain {
	public static void main(String[] args) {

		TV tv = new TV();
		tv.print();
		tv.power();
		tv.print();
		tv.chanelUp();
		tv.chanelUp();
		tv.print();
		
		TV tv2 = new TV();
		tv2.print();
		tv.chanelUp();
		tv2.print();
	
		System.out.println(tv.chanel);
		
		
	}

	
	
}

실행 결과

TVMain이라는 클래스의 main()메서드 에서  TV 타입의 tv라는 객체변수에 new연산자를 통해 TV 객체를 생성했고

아래 TV타입의 tv2라는 객체변수에 new연산자를 통해 TV객체를 생성했다.

tv와 tv2는 데이터 타입은 같지만 전혀 다른 독립적인 객체를 생성한것이다.

 

다음 예제는 객체를 배열에 저장하는 예제이다.

package chapter7;

public class TVMain2 {

	public static void main(String[] args) {
		TV[] tvs = new TV[3];
		for (int i = 0 ; i < tvs.length ; i++) {
//			tvs[i].chanel = 10;
//			tvs[0] = new TV(); // Ox100
//			tvs[1] = new TV(); // Ox200
//			tvs[2] = new TV(); // Ox300
//								  Ox는 주소이며 뒤에 숫자는 임의로 만든것이니 그냥 주소에 저장된다고 생각하면 된다.
			tvs[i] = new TV();
			tvs[i].chanel = i + 10;
		}
//		tvs = null;
		System.out.println(tvs);		
		System.out.println(tvs[0]);		
		System.out.println(tvs[1]);		
		System.out.println(tvs[2]);		
	}

}

실행 결과

 

자료형적인 개념의 클래스를 끝으로 23-01-13 수업내용 정리를 마치겠다.

'JAVA' 카테고리의 다른 글

23-01-16 수업내용 정리  (0) 2023.01.16
23-01-12 수업내용 정리  (0) 2023.01.15
23-01-11 수업내용 정리  (0) 2023.01.13
23-01-10 수업내용 정리  (0) 2023.01.13
23-01-09 수업내용 정리  (0) 2023.01.12