11/13 수업 (11일차)
** 실습 **
/* 8(1110수업)
*
문제)위와 동일하게 정수배열 5행 5열로 정의 한 후 1부터 1씩 증가해서 값을 채운 후 아래와
같이 출력하는 프로그램.(단 출력형식으로 배열에 저장)
단, 배열에 저장시만 1씩 증가하는 순서로 배열에 저장.
출력예) 1 2 3 4 5
10 9 8 7 6
11 12 13 14 15
20 19 18 17 16
21 22 23 24 25
*/
int[][] arr = new int[5][5];
int i, j, k = 1;
for(i = 0 ; i < arr.length ; i++)
{
if(i % 2 == 0)
{
for(j = 0 ; j < arr[i].length ; j++)
{
arr[i][j] = k;
k++;
}
}
else
{
for(j = arr[i].length-1 ; j >= 0 ; j--)
{
arr[i][j] = k;
k++;
}
}
}
for(i = 0 ; i <arr.length ; i++)
{
for(j = 0 ; j < arr.length ; j++)
{
System.out.printf("%3d", arr[i][j]);
}
System.out.println();
}
** 실습2 **
/* 1
문제)4행4열인 2차원 배열을 만들고 1~10까지 정수를 10개 랜덤하게 생성해 임의의 차례로 삽입하고
납은 6개의 수는 모두 0으로 채워 넣습니다.
단, 동일한 정수가 있어도 상관없고 만들어진 2차원 배열을 화면에 출력.
랜덤 값은 0~10사이로 (int)(Math.random()*10 + 1) 사용. //1~10
6개 0을 넣을 위치는 (int)(Math.random()*4)사용. //4생4열이므로 0~3
출력시 printf(%2d ", 변수) 사용
출력예) 0 6 0 5
0 8 0 7
8 0 0 5
4 1 3 2
*/
int[][] a = new int[4][4];
int i, j, z;
//정수를 랜덤하게 생성해서 저장
for(i = 0 ; i < a.length ; i++)
{
for(j = 0 ; j < a[i].length ; j++)
{
a[i][j] = (int)(Math.random()*10 + 1);
}
}
//6개의 랜덤 위치에 0으로 넣어주기
for(z = 0 ; z < 6 ; z++)
{
i = (int)(java.lang.Math.random()*4); //오류날 경우 java.lang 넣어주기
j = (int)(Math.random()*4);
if(a[i][j] == 0)
{
z--;
continue;
}
a[i][j] = 0;
}
//(다른방법)6개의 랜덤 위치에 0으로 넣어주기
while(z < 7)
{
i = (int)(java.lang.Math.random()*4);
j = (int)(Math.random()*4);
if(a[i][j] != 0)
{
a[i][j] = 0;
z++;
}
}
//배열출력
for(i = 0 ; i < a.length ; i++)
{
for(j = 0 ; j < a[i].length ; j++)
{
System.out.printf("%2d ", a[i][j]);
}
System.out.println();
}
** 객체지향언어 **
프로그램을 객체단위로 나누어서 객체를 중심으로 프로그램을 구성하는 언어.
객체단위로 구현하며 예를 들면 사람, 동물, 자동차 등... 단위로 구현.
- 특징 : 캡슐과, 다형성, 상속성
1. 코드의 재사용성 : 기존 코드를 이용하여 쉽게 작성한다. (상속성)
2. 코드의 관리 용이 : 코드간의 관계를 이용하여 쉽게 코드 변경 (다형성과 메소드의 오버로딩)
3. 신뢰성이 높은 프로그래밍 가능 : 데이터 보호하고 올바른 값 유지 (캡슐화와 데이터 은닉화)
장점 : 코드의 재사용성이 높고 유지보수가 용이함
Tv t = new Tv(); Tv클래스를 객체생성(new Tv())해서 인스턴스t로 객체를 바라보게했다. new를 통해
** 클래스와 객체 **
클래스 - 객체를 만들어 내기 위한 설계도 혹은 틀
연관되어 있는 변수와 메서드의 집합
객체 - 소프트위어 세계에 구현할 대상
클래스에 선언된 모양 그대로 생성된 실체
클래스의 인스턴스(instance)라고도 함
객체는 모든 인스턴스를 대표한는 포괄적 의미
클래스의 타입으로 선언되었을때 객체라고 함
인스턴스 - 객체가 메모리에 할당되어 실제 사용될때 인스턴스라고 한다.
객체는 클래스의 인스턴스
클래스는 설계도, 객체는 설계도로 구현한 모든 대상
클래스의 타입으로 선언되었을때 객체라고 부르고, 그 객체가 메모리에 할당되어 실제 사용될때 인스턴스라고 함
- 객체의 구성요소
· 속성(property) : 멤버변수(member variable)
특성 (attribute)
필드 (field)
상태 (state)
· 기능(function) : 메서드 (method)
함수 (function)
행위 (behavior)
객체 구성요소 | |
속성(property) | |
기능(function) |
- 변수와 메서드 (클래스는 변수와 메서드로 이루어져있다.)
종류 | 선언위치 | 생성시기 |
클래스 변수 (static 있으면 클래스변수) | 클래스 영역 | 클래스가 메모리에 올라갈때 별도의 객체생성 없이 사용가능 |
인스턴스변수 (반드시 객체생성 후 사용가능) | 클래스 영역 | 인스턴스가 생성되었을때 (new) |
지역 변수 (메소드 안에서만 사용가능) | 메서드, 생성자, 초기화 블록내부 | 변수 언어문이 수행될때 |
- example)
class MySample{
int iv; //인스턴스변수
static int cv; //클래스변수
void method()
{
int iv = 0; //지역변수
}
}
//다른 집
s.iv
a.iv
//같은 집
s.cv
a.cv
java에서 static 있으면 new가 필요 없다.
** 메서드 **
- 특정 작업을 수행하는 일려느이 문장들을 하나로 묶은 것을 의미함.
- 메서드 사용 이유
1. 높은 재사용성
2. 중복된 코드 제거
3. 프로그램의 구조화
반환타입 메서드이름(타입 변수명, 타입 변수명, ...){ 선언 구현부 } → 선언구현부 한줄밖에 없어도 {} 꼭 써야한다.
매개변수
메서드 이름 - (소문자 시작, 두번째단어는 대문자)
반환타입이 없을경우 void 를 사용해줘야한다.
example)
int add(int a, int b) //선언부
{
int result = a + b; //구현부
returm result;
}
public class MySample1113_2 {
//클래스
int iv; //인스턴스 변수
static int cv; //클래스 변수
int methodA(int k) //지역 변수k -> methodA 메서드에서만 쓰는 k변수
{
int lv = 5; //지역변수 lv, a
k = k + lv;
System.out.println("methodA() lv : " + lv);
System.out.println("methodA() a : " + k);
return k;
}
public static void main(String[] args) {
MySample1113_2 a = new MySample1113_2();
MySample1113_2 b = new MySample1113_2();
MySample1113_2 c = new MySample1113_2();
System.out.println("before a.iv : " + a.iv + ", b.iv : " + b.iv + ", c.iv : " + c.iv);
//서로 다른 집의 iv
a.iv = 10;
b.iv = 20;
c.iv = 30;
System.out.println("after a.iv : " + a.iv + ", b.iv : " + b.iv + ", c.iv : " + c.iv);
a.cv = 11;
b.cv = 22;
c.cv = 33;
System.out.println("after a.cv : " + a.cv + ", b.cv : " + b.cv + ", c.cv : " + c.cv);
System.out.println("1 MySample1113_2.cv : " + MySample1113_2.cv);
MySample1113_2.cv = 55;
System.out.println("after a.cv : " + a.cv + ", b.cv : " + b.cv + ", c.cv : " + c.cv);
System.out.println("1 MySample1113_2.cv : " + MySample1113_2.cv);
//메서드 호출
int k = 60; //지역 변수 k -> main 메서드에서만 쓰는 k변수 -> methodA에서 쓴는 변수 k랑은 이름만 같을 뿐
a.methodA(50);
System.out.println("main() method() 호출 전 k : " + k);
b.methodA(k);
System.out.println("main() method() 호출 후 k : " + k);
System.out.println("main() method() 호출 후 바로 반환 : " + b.methodA(k));
// c.methodA(k + 30);
int a1 = 10;
}
}
class Tv
{
//인스턴스 변수(클래스에서 선언된 변수는 모든곳에서 사용가능)
String color; //tv색상
boolean power; //전원상태(on/off)
int channel; //채널
//메서드
void power()
{
power = !power;
}
void channelUp()
{
channel++;
}
void channelDown()
{
channel--;
}
}
public class MySample1113_3 {
public static void main(String[] args) {
//클래스
Tv t = new Tv(); //객체선언
t.channel = 11; //변수
t.channelDown(); //메서드
t.channelUp();
System.out.println("현재 채널은 " + t.channel + " 입니다.");
//현재 채널 11에서 7번으로 변경 설정.
t.power();
t.color = "검정";
for(int i = t.channel ; i > 7 ; i--)
{
t.channelDown();
}
System.out.printf("tv전원은 %b 이고, 색상은 %s, 채널은 %d 입니다.\n",
t.power, t.color, t.channel);
//------------------------------------------------------------------------------------
/* 1
실행결과)t1의 channel값은 0입니다.
t2의 channel값은 0입니다.
t1의 channel값을 7로 변경했습니다.
t1의 channel값은 7입니다.
t2의 channel값은 7입니다. //참조형 대입으로 처리
*/
Tv t1, t2;
t1 = new Tv();
t2 = new Tv();
// Tv t1 = new Tv(); //위와 같음
// Tv t2 = new Tv();
t1.channel = 0;
t2.channel = 0;
System.out.println("t1의 channel값은 " + t1.channel + "입니다.");
System.out.println("t2의 channel값은 " + t2.channel + "입니다.");
for(int i = t1.channel ; i < 7 ; i++)
{
t1.channelUp();
}
System.out.println("t1의 channel값을 " + t1.channel + "로 변경했습니다.");
t2 = t1;
System.out.println("t1의 channel값은 " + t1.channel + "입니다.");
System.out.println("t2의 channel값은 " + t2.channel + "입니다.");
//------------------------------------------------------------------------------------
/* 2
실행결과)t1의 channel값은 0입니다.
t2의 channel값은 0입니다.
t1의 channel값을 5로 변경했습니다. //변수에 값대입하여 적용
t2의 channel값을 11로 변경했습니다. //변수에 값대입하여 적용
t1의 channel값은 11입니다.
t2의 channel값은 11입니다.
*/
Tv t1 = new Tv();
Tv t2 = new Tv();
System.out.println("t1의 channel값은 " + t1.channel + "입니다.");
System.out.println("t2의 channel값은 " + t2.channel + "입니다.");
t1.channel = 5;
t2.channel = 11;
System.out.println("t1의 channel값을 " + t1.channel + "변경했습니다.");
System.out.println("t2의 channel값을 " + t2.channel + "변경했습니다.");
t1 = t2;
System.out.println("t1의 channel값은 " + t1.channel + "입니다.");
System.out.println("t2의 channel값은 " + t2.channel + "입니다.");
}
}
** 객체 배열 **
//------------------------------------------------------------------------------------------------
//객체 배열
Tv[] t1 = new Tv[3]; //객체생성 아직안됨, 객체생성은 이름() 이렇게해야함
int i;
for(i = 0 ; i < t1.length ; i++)
{
t1[i] = new Tv(); //각각 Tv 시작 주솟값을 t1[i]배열에 각각대입
t1[i].channel = i + 10;
System.out.printf("전 t1[%d], channel1 = %d \n", i, t1[i].channel);
}
System.out.println();
for(i = 0 ; i < t1.length ; i++)
{
t1[i].channelUp();
System.out.printf("후 t1[%d].channel = %d \n", i, t1[i].channel);
}
//객체배열 복사 응용
System.out.println("t1 : " + t1); //t1[0]의 주소값 (실제 윈도우 주소는 X)
System.out.println("t1[0] : " + t1[0]); //new Tv()했을 때 객체생성한 주소값
System.out.println("t1[1] : " + t1[1]);
System.out.println("t1[2] : " + t1[2]);
Tv a = new Tv();
System.out.println("a : " + a);
a = t1[1];
System.out.println("후 a : " + a);
System.out.println("a.channel : " + a.channel + ", t1[1].channel : " + t1[1].channel);
a.channel = 20;
System.out.println("
class Tv
{
//참조형 변수를 활용한 예제 샘플용
void channelTest(Tv a) //참조형(주소)
{
System.out.println("Tv channelTest() a.channel : " + a.channel);
a.channel = 20;
System.out.println("후 Tv channelTest() a.channel : " + a.channel);
}
void channelTest2(int ch) //기본형(값)
{
System.out.println("Tv channelTest2() ch : " + ch);
ch = 20;
System.out.println("후 Tv channelTest2() ch : " + ch);
}
}
public class MySample1113_3 {
public static void main(String[] args) {
//참조형 변수로 활용한 예제
Tv z = new Tv();
z.channel = 11;
System.out.println("main() z.channel : " + z.channel);
z.channelTest(z);
System.out.println("후 main() z.channel : " + z.channel);
System.out.println();
System.out.println();
int ch = 11;
System.out.println("main() ch : " + ch);
z.channelTest2(ch);
System.out.println("후 main() ch : " + ch);
}
}