수업끄적끄적_7MONTH/Java

11/13 수업 (11일차)

개미의 베짱이 2023. 11. 13. 17:42

** 실습 **

/* 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);
		

	}

}