package ex0714;
public class Ex01_field {
public static void main(String[] args) {
// TODO Auto-generated method stub
Test1 t1 = new Test1(); //객체 생성 Test1 클래스의 a와 b 필드가 메모리 할당 (객체가 10개면 방도 10개)
Test1 t2 = new Test1();
System.out.println(t1.b);
System.out.println(t2.b);
}
}
class Test1 {
// 필드 : 인스턴스 변수 + 클래스 변수
// 인스턴스 변수
// 인스턴스 변수는 객체가 생성될때 메모리가 생성. 메모리를 할당 받을때 기본값으로 초기화
// 인스턴스 변수는 객체마다 메모리 할당. heap 메모리 영역에 할당
// 인스턴스 변수는 객체가 null이 되거나 오랫동안 사용되지 않으면 가비지 컬렉터가 메모리를 회수함
int a;
int b=10;
//클래스 변수
// 클래스가 로딩될때 메모리 할당
// 객체 생성과 상관없이 하나만 메모리 할당되고 모든 객체가 공유해서 사용 가능
//프로그램 종료되는 시점에 메모리 제거
static int c = 100;
// 매개변수, 지역변수 : 스택 메모리 영역에 메모리 할당
// 매개변수와 지역변수는 메소드를 호출할때 메모리가 할당되고 메소드를 빠져나가면 메모리에서 제거됨
//인스턴스 메소드 : 객체가 생성되어야 호출되는 메소드로 객체를 통해서 호출
// 메소드에는 거의 public을 붙여준다 public을 안붙이면 같은 패키지에서만 사용 가능하기 때문에 패키지 벗어나면 사용 xx
public int sub(int n) { // n: 매개변수
int s=0; // 지역변수
for(int i=1; i<=n; i++) {
s+=i;
}
return s;
}
public void sub2(int n) {
}
//클래스 메소드 : 객체 생성과 상관없이 클래스 이름으로 호출하는 메소드
public static void demo() {
System.out.println(c); //클래스 변수 호출가능
//System.out.println(a); //인스턴스 변수는 호출 안돼
//클래스 메소드에서 객체를 생성해서 인스턴스 변수나 메소드에 접근 가능
Test1 tt = new Test1();
System.out.println(tt.a);
}
}
package ex0714;
public class Ex02_method {
public static void main(String[] args) {
// TODO Auto-generated method stub
Test2 ob = new Test2();
String s;
s=ob.isLeap(2021) ? "윤년" : "평년";
System.out.println(s);
int[]a = {2,4,6,8,10};
int n = ob.sum(a);
System.out.println(n);
int [] num = ob.random(10);
if(num != null) {
for(int i=0; i<num.length; i++) {
System.out.print(num[i]+" ");
}
System.out.println();
}
}
}
class Test2{
//윤년 판별 메소드
public boolean isLeap(int y) {
return y%4==0 && y%100 != 0 || y%400 == 0;
}
//배열로 주어진 매개변수의 배열 합 계산
public int sum(int [] num) {
int s=0;
for(int n: num) {
s+=n;
}
return s;
}
// 1~100사이 난수를 n개 발생하여 배열로 반환
public int[] random(int n) {
if(n<1) {
return null;
}
int[]a = new int[n];
for(int i=0; i<a.length; i++) {
a[i] = (int)(Math.random()*100)+1;
}
return a;
}
}
package ex0714;
public class Ex03_method {
public static void main(String[] args) {
// 직사각형의 넓이와 둘레 계산
Rect x = new Rect();
x.area();
int a,b;
x.w = 10; //필드 인스턴스 변수에 값 대입
x.h = 5;
a=x.area();
b=x.length();
System.out.println("넓이 : "+a+" 둘레: "+b);
}
}
class Rect{
int w;
int h;
//넓이
public int area() {
return w*h;
}
//둘레
public int length() {
return (w+h)*2;
}
}
파라미터 전달 방법
package ex0714;
//파라미터 전달 방법
public class Ex04_method {
public static void main(String[] args) {
Test4 tt = new Test4();
int n =5;
// call by value
tt.sub1(n);
System.out.println(n);
// call by reference(참조에 의한 호출)
tt.sub2(tt);
System.out.println(tt.x);
int []ss = {10,20,30};
tt.sub3(ss);
System.out.println(ss[1]);
}
}
class Test4 {
int x = 10;
// call by value(기본) : 실 매개변수와 형식 매개변수가 기억 공간 따로 확보
public void sub1(int a) {
a = a+10;
}
// call by reference : 레퍼런스 변수(객체)
public void sub2(Test4 t) {
t.x += 5;
}
// call by reference : 레퍼런스 변수(배열)
public void sub3(int[] nn) {
nn[1] += 100;
}
}
해쉬값 출력
package ex0714;
public class Ex05_method {
public static void main(String[] args) {
// TODO Auto-generated method stub
Test5 ob1; //레퍼런스 변수(메모리 할당 안하면 못씀)
ob1 = new Test5(); //메모리 할당 완료
Test5 ob2 = new Test5();
System.out.println(ob1==ob2); //false
ob1.a += 100;
System.out.println(ob1.a+" "+ob2.a);
Test5 ob3 = ob2; //ob2와 ob3은 같은 주소 공유
System.out.println(ob2 == ob3);//true
ob3.a += 200;
System.out.println(ob2.a);
//클래스 해쉬코드 출력
System.out.println(ob1);
System.out.println(ob2);
System.out.println(ob3);
//ob2 과 ob3이 같은걸 확인할 수 있다.
}
}
class Test5{
int a=10;
int b=20;
public void print() {
System.out.println(a+":"+b);
}
}
재귀호출 및 stack
package ex0714;
//재귀호출 : 메소드에서 자신의 메소드를 다시 호출
//처리하지 못한 데이터는 스택에 저장함.
public class Ex06_recursion {
public static void main(String[] args) {
// TODO Auto-generated method stub
Test7 ob = new Test7();
ob.print(5);
//stack이 넘치면 StackOverFlowError 발생
}
}
class Test7{
public void print(int n) {
if(n>1) {
print(n-1); //재귀호출
}
System.out.println(n);
}
}
//stack 개념으로 봐야한다.
//처음에 5-1이 되어서 4가 되었지만 다시 print 재귀호출을 함
//그렇게 if문이 거짓이 될때까지 1까지 내려간다.
//그러면 이제 if문 넘어가서 1이 출력이 된다.
//이제 stack의 개념을 따라서 (stack은 Last in First out의 구조)
// stack안에 담겨있던 2,3,4,5가 출력이 된다.
package ex0714;
//재귀 호출
public class Ex07_recursion {
public static void main(String[] args) {
// TODO Auto-generated method stub
Test8 tt = new Test8();
int s;
s=tt.sum(10);
System.out.println(s);
s=tt.zz(10);
System.out.println(s); //2의10승 = 1024
System.out.println(tt.pow(2,5));
System.out.println(tt.pow(2,-2));
//최대 공약수
System.out.println(tt.gcd(12,8));
}
}
class Test8{
public int sum(int n) {
return n>1 ? n+sum(n-1) : n;
// 10+sum(9)
// 9+sum(8)
// :
// 2+sum(1)
}
//2의 x승 결과(재귀호출)
public int zz(int x) {
return x>=1 ? 2*zz(x-1) : 1;
}
//x의 y승 결과
public double pow(int x, int y) {
if(y>=0) {
return y>=1 ? x*pow(x,y-1) : 1;
}
else {
return (1.0 / x) * pow(x,y+1);
}
}
//최대 공약수
public int gcd(int a, int b) {
return b==0 ? a : gcd(b, a%b);
}
}
재귀 호출 2
package ex0714;
// 재귀 호출2
public class Ex08_recursion {
public static void main(String[] args) {
// TODO Auto-generated method stub
print(3);
}
public static void print(int n) {
System.out.println("start : " + n);
if(n > 1) {
print(n-1); //재귀호출 2번함
print(n-1);
}
System.out.println("end : " + n);
}
}
package ex0714;
//overloading : 메소드 중복정의
// 메소드 이름은 같지만 메소드 괄호안에 있는 매개변수의 개수가 다르거나 자료형이 다르면 다른 메소드이다.
public class Ex10_overloading {
public static void main(String[] args) {
// TODO Auto-generated method stub
Test10 ob = new Test10();
ob.print();
short a = 10;
ob.print(a); //동일한 기본 자료형의 인수를 가진 메소드가 없으면 기본 자료형중에서 가장 가까운
// 큰 자료형의 메소드 호출함.
Short b = 10;
ob.print(b);
long d=10; //자기랑 비슷한 Long 찾음
ob.print(d);
}
}
class Test10{
// Wrapper 클래스 : 기본 자료형에 대응하는 클래스로 Short, Integer, Long 등등
// Short : Wrapper 클래스. 기본 자료형인 short를 클래스로 작성한 것.
public void print() { //<<메소드 명이 다 똑같음 근데 괄호안에 타입으로 구분한다. 이게 메소드 중복정의
System.out.println("인자가 없는 메소드");
}
public void print(Short a) {
System.out.println("Short : "+ a);
}
public void print(int a) {
System.out.println("int : "+ a);
}
// Long : Wrapper 클래스. 기본 자료형인 Long을 클래스로 작성한 것.
public void print(Long a) {
System.out.println("Long : "+ a);
}
public void print(int a, int b) {
System.out.println("매개변수 2개 : "+ a+ ","+b);
}
}
비정형인자(배열로 간주)
package ex0714;
// 비정형인자(배열로 간주)
public class Ex11_method {
public static void main(String[] args) {
// TODO Auto-generated method stub
Test11 t = new Test11();
int s1 = t.sum(1,2,3,4,5);
System.out.println(s1);
int s2 = t.sum(1,2,3);
System.out.println(s2);
}
}
class Test11 {
public int sum(int ...args) {
int s = 0;
for(int n: args) {
s+=n;
}
return s;
}
}
인스턴스 배열 생성
package ex0714;
// 인스턴스 배열 생성
public class Ex12 {
public static void main(String[] args) {
// TODO Auto-generated method stub
// 객체 배열
Test12[]tt = new Test12[5]; //Test12 객체를 5개 저장할 수 있는 배열
//각 객체의 메모리가 할당된것은 아님
// 객체의 메모리 할당은 생성자를 호출할 경우에만 메모리가 할당됨.
/* 런타임 오류 NullpointExceprion
tt[0].a = 10;
tt[0].print();
*/
// 객체 배열의 메모리 할당(5개)
for(int i=0; i<tt.length; i++) {
tt[i] = new Test12();
}
tt[0].a = 10;
tt[0].print();
}
}
class Test12{
int a;
int b;
public void print() {
System.out.println(a+","+b);
}
}
년도를 매개변수로 넘겨 받아 띠를 구하는 메소드
정수를 매개변수로 입력받아 정수의 길이 구하기
서로 다른 3자리 난수 발생, 단 각자리수가 겹치면 안됨.
package ex0714;
//문제들
public class Ex13Q1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Test13 ob = new Test13();
System.out.println(ob.tti(2021));
System.out.println(ob.length(-135));
System.out.println(ob.number3());
}
}
class Test13 {
// 년도를 매개변수로 넘겨 받아 띠를 구하는 메소드
public String tti(int year) {
String[]t = new String[] {"원숭이","닭","개","돼지","쥐","소","호랑이","토끼","용","뱀","말","양"};
return t[year%12];
}
// 정수를 매개변수로 입력받아 정수의 길이 구하기
public int length(int n) {
/*
int len=1;
if(n < 0) {
n = -n;
}
while(n>=10) {
n=n/10;
len++;
}
return len;
*/
if(n<0) {
n=-n;
}
return n>=10 ? 1+length(n/10) : 1;
}
//서로 다른 3자리 난수 발생 단 각자리수가 겹치면 안됨.
public int number3() {
int m1,m2,m3;
m1 = (int)(Math.random()*9)+1; // 1~9 100의자리
do {
m2 = (int)(Math.random()*10); // 0~9
} while(m1 == m2);
do {
m3 = (int)(Math.random()*10);
} while(m1==m3 || m2==m3);
return m1*100 + m2*10 +m3;
}
}