728x90
반응형

<오늘의 학습>

1. 업캐스팅

2. 다운캐스팅

3. instanceof

4. 오버라이딩

5. 오버로딩

6. 연결 리스트 (Linked list)

 

 

1.  업캐스팅

  • 서브 클래스 객체를 슈퍼 클래스 타입으로 타입 변환하는 것
  • 업캐스팅된 레퍼런스는 객체 내에 슈퍼 클래스의 멤버만 접근이 가능하다.
class Person {...}
class Student extends Person {...}

Student s = new Student();
Person p = s;//업캐스팅 자동타입 변환
Person p = new Student();//업캐스팅
  • 레퍼런스 p를 이용하면 Student 객체의 멤버 중 Person의 멤버에만 접근이 가능하다.

 

 

 

2.  다운캐스팅

  • 슈퍼 클래스 객체를 서브 클래스 타입으로 변환하는 것
  • 개발자의 명시적 타입 변환 표시가 필요하다.
		class Person {...}
		class Student extends Person {...}
	
		Person p = new Student();//업캐스팅
		Student s;
		s = (Student)p; //다운캐스팅

 

 

 

3.  instanceof

  • 레퍼런스가 가리키는 객체의 타입 식별을 위해 사용한다. 슈퍼 클래스는 여러 서브 클래스에 상속되기 때문에 업캐스팅된 레퍼런스로 객체의 타입을 판단하는 것이 어렵기 때문이다.
  • 사용 : 객체 레퍼런스 instanceof 클래스타입
  • 연산의 결과는 true와 false의 boolean 값으로 나온다.

 

 

 

실습 내용

 

[JAVA] 과일 예제 (업캐스팅/다운캐스팅)

문제1 아래의 Fruit 클래스와 main를이용해 Banana, Orange, Apple 클래스를 작성하라. Fruit 클래스 상속 받아 Banana, Orange, Apple 클래스 생성 3개의 클래스는 int형 price 변수를 가지며, 생성자를 통해 초기화

deliciouscode.tistory.com

 

 

 

 

다음 학습

 

[JAVA] 오버라이딩과 오버로딩, 연결 리스트 (14일차)

1. 업캐스팅 2. 다운캐스팅 3. instanceof 4. 오버라이딩 5. 오버로딩 6. 연결 리스트 (Linked list) 4. 오버라이딩 (재정의) 슈퍼 클래스에 선언된 메소드를, 각 서브 클래스들이 자신만의 내용으로 새로 구

deliciouscode.tistory.com

 

728x90
반응형
728x90
반응형

 

 

문제1

 

▶ ColorTV 코드

public class ColorTV extends TV{
	private int color;
	
	ColorTV(int size, int color){
		super(size);
		this.color=color;
	}
	
	void printProperty(){
		System.out.println(getSize()+"인치 "+color+"컬러");
	}
}

 

▶ 출력 결과

32인치 1024컬러

 

 

 

문제2

 

▶ IPTV 코드

public class IPTV extends ColorTV{
	private String area;
	
	IPTV(String area, int size, int color){
		super(size,color);
		this.area=area;
	}
	void printProperty(){
		System.out.print("나의 IPTV는 "+area+" 주소의 ");
		super.printProperty();
	}
}

 

▶ 출력 결과

나의 IPTV는 192.1.1.2 주소의 32인치 2048컬러

 

 

 

728x90
반응형
728x90
반응형

문제1

다음 main() 메소드를 실행하였을 때 예시와 같이 출력되도록 TV 클래스를 작성하라.

public static void main(String[] args) {
   TV myTV = new TV("LG", 2017, 32); //LG에서 만든 2017년 32인치
   myTV.show();
}


결과 : LG에서 만든 2017년형 32인치 TV

 

▶  TV 코드

public class TV {
	private String business;
	private int year;
	private int inch;

	TV(String business, int year, int inch){
		this.business=business;
		this.year=year;
		this.inch=inch;
	}//TV의 매개변수를 가진 생성자. 초기화

	void show(){
		System.out.printf("%s에서 만든 %d년형 %d인치 TV\n", business, year, inch);
	}//입력된 결과를 출력
}

 

▶ main 코드

	public static void main(String[] args) {
		TV myTV = new TV("LG", 2017, 32); //객체 생성 및 초기화
		myTV.show(); //결과 : LG에서 만든 2017년형 32인치 TV

	}//main_end

 

▶ 출력 결과

LG에서 만든 2017년형 32인치 TV

 

 

 

문제2

다음 main() 메소드를 실행하였을 때 예시와 같이 출력되도록 Grade클래스를 작성하라. 3개의 과목의 점수를 입력받아 Grade 객체를 생성하고 성적 평균을 출력하는 main()과 실행 예시는 다음과 같다.

public static void main(String[] args) {
   Scanner sc = new Scanner(System.in);
   System.out.print("수학, 과학, 영어 순으로 3개의 정수 입력 >> ");
   int math = sc.nextInt();
   int science = sc.nextInt();
   int english = sc.nextInt();
   Grade me = new Grade(math, science, english);
   System.out.println("평균은 "+me.average()); // average()는 평균을 계산하여 리턴   
   sc.close();
}

결과 : 수학, 과학, 영어 순으로 3개의 정수 입력 >> 90 88 96
평균은 91

 

▶  Grade 코드

public class Grade {
	private int math;
	private science;
	private english;

	Grade(int math, int science, int english){
		this.math=math;
		this.science=science;
		this.english=english;
	}//Grade의 매개변수를 가진 생성자. 초기화

	int average(){
		int avg = (math+science+english)/3;
		return avg;
	}//평균을 계산하여 정수 값을 리턴
	//90 88 96의 평균 =>  int형 91으로 출력. (실수 값으로 평균을 구했을 때는 91.33333333333333 값이 나온다.)
}

 

▶ main 코드

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);

		//과목별 점수 입력
		System.out.print("수학, 과학, 영어 순으로 3개의 정수 입력 >> ");
		int math = sc.nextInt();
		int science = sc.nextInt();
		int english = sc.nextInt();

		Grade me = new Grade(math, science, english);//객체 생성 및 초기화
		System.out.println("평균은 "+me.average()); //average()는 평균을 계산하여 리턴 

		sc.close();
	}//main_end

 

▶ 출력 결과

수학, 과학, 영어 순으로 3개의 정수 입력 >> 90 88 96
평균은 91

 

 

 

문제3

TV2 클래스를 상속받는 ColorTV 클래스를 만들어라. 출력 결과가 일치하도록 ColorTV 클래스를 작성하라.

public class TV2 {
	private int size;

	void setSize(int size){
		this.size = size;
	}
	
	int getSize(){
		return size;
	}
}
	public static void main(String[] args) {
		ColorTV myTV = new ColorTV();
		myTV.setSize(32);
		myTV.setColor(1024);
		myTV.printProperty();	
	}

출력 결과 : 32인치 1024컬러

 

▶  ColorTV 코드

public class ColorTV extends TV2{
	private int color;
	
	void setColor(int color){
		this.color=color;
	}
	
	void printProperty(){
		System.out.println(getSize()+"인치 "+color+"컬러");
	}
}

 

▶  출력 결과

32인치 1024컬러

 

 

 

문제4

▼ 실습 내용

 

[JAVA] TV 상속

문제1 ▶ ColorTV 클래스 코드 public class ColorTV extends TV{ private int color; ColorTV(int size, int color){ super(size); this.color=color; } void printProperty(){ System.out.println(getSize()+"인치 "+color+"컬러"); } } ▶ 출력 결과 32

deliciouscode.tistory.com

 

 

 

728x90
반응형

'HRD_훈련 > 실습' 카테고리의 다른 글

[JAVA] 심화 문제 풀이 (14일차)  (0) 2023.06.01
[JAVA] TV 상속  (0) 2023.05.31
[JAVA] 심화 문제 풀이 (12일차)  (0) 2023.05.31
[JAVA] 홀수→짝수 순으로 배열 정렬  (0) 2023.05.30
[JAVA] 선택 정렬 보완  (0) 2023.05.28
728x90
반응형

<오늘의 학습>

1. static / non-static

2. static / final

3. 클래스 안에서 this() 이용

4. 상속과 접근 제한자

5. 상속과 super() 호출

 

 

1.  static / non-static

▶ static 멤버

  • 객체를 생성하지 않아도 사용이 가능하다.
  • 객체마다 생기는 것이 아니고, 클래스당 하나만 생성되는 공간적 특성을 가지고 있다. (객체 내부가 아닌 별도의 공간에 생성되기 때문이다.)
  • static 멤버들은 클래스가 로딩될 때 공간이 할당되는 시간적 특성을 가진다. 객체가 생기기 전에 이미 생성이 되어 객체가 생기기 전에도 사용이 가능하다. 객체가 사라져도 멤버는 사라지지 않으며 프로그램이 종료될 때 사라진다.
  • static 멤버들은 동일한 클래스의 모든 객체에 의해 공유된다.
  • 클래스 멤버라고도 부른다.

 

▶ non-static 멤버

  • 멤버들은 객체마다 독립적으로 별도 존재하는 공간적 특성을 가지고 있다.
  • 객체가 생길 때 생성되기 때문에 객체가 생성된 뒤에 사용할 수 있다. 객체가 사라지면 멤버도 사라진다.
  • 멤버들은 각각의 공간을 유지하기 때문에 다른 객체에 의해 공유되지 않는다. (배타적) 
  • 인스턴스 멤버라고도 부른다.

 

 


▶ 예제) static 변수와 non-static 변수를 StaticClass에 넣고, main문에서 값을 바꿔꾸며 비교해 보자.

▷ StaticClass 코드

public class StaticClass {
	static int staticNum;
	int nonStaticNum;
}

 

main 코드

		StaticClass.staticNum=10;
		System.out.println("StaticClass.staticNum:"+StaticClass.staticNum);
		System.out.println(); //줄바꿈
		
		StaticClass obj = new StaticClass();
		obj.staticNum=30;
		
		System.out.println("StaticClass.staticNum:"+StaticClass.staticNum);
		System.out.println("obj.staticNum:"+obj.staticNum);

 

▷ 출력 결과

StaticClass.staticNum:10

StaticClass.staticNum:30
obj.staticNum:30
  • static 변수는 클래스 당 하나로 공동으로 사용된다. 객체로 접근하더라도 최종적으로 수정된 30으로 출력된다.

 

 


▶ 위 예제에서 staticClass 객체를 하나 더 생성하여 값을 출력해 보자.

▷ main 코드

		StaticClass obj2 = new StaticClass();
		obj2.staticNum=100;
		obj.nonStaticNum=20;
		obj2.nonStaticNum=200;
		
		System.out.println("StaticClass.staticNum:"+StaticClass.staticNum);
		System.out.println("obj.staticNum:"+obj.nonStaticNum);
		System.out.println("obj2.staticNum:"+obj2.nonStaticNum);

 

▷ 출력 결과

StaticClass.staticNum:100
obj.staticNum:20
obj2.staticNum:200
  • staticNum의 값은 최종적으로 수정된 100으로 출력된다.
  • non static 변수는 독립적이기 때문에 각각 가지고 있는 값이 출력된다.

 

 

 

2.  static / final

▶ static 활용

  • 전역 변수와 전역 함수를 만들 때 활용한다. 전역변수나 전역 함수는 static으로 클래스에 작성한다.
  • 모든 필드와 메소드가 public static으로 선언되면 다른 모든 클래스에서 사용할 수 있다.
  • 공유 멤버를 작성할 때, static 필드나 메소드는 하나만 생성하여 클래스의 객체들을 공유한다.
  • static 멤버를 가진 클래스 사례 :  Math 클래스 : java.lang.Math

 

 

▶ static 메소드의 제약 조건

static 메소드는 non-static 멤버에 접근할 수 없다. 객체가 생성되지 않은 상황에서도 static 메소드는 실행될 수 있기 때문에 non-static 메소드와 필드를 사용할 수 없다. 반대로 non-static 메소드는 static 멤버 사용이 가능하다.

static 메소드는 this 레퍼런스를 사용할 수 없다. static 메소드는 객체가 생성되지 않은 상황에서도 호출이 가능하므로, 현재 객체를 가리키는 this를 사용할 수 없다.

 

 

▶ final

static과 final는 주로 함께 이용된다.

final 필드 : 상수를 선언할 때 사용한다. 상수 필드는 선언 시에 초기 값을 지정하여야 하며, 실행 중에 값을 변경할 수 없다

final 클래스 : 클래스 상속을할 수 없게 한다.

final 메소드 : 오버라이딩을 할 수 없게 한다.

 

 


▶ 예제) static으로 작성된 전역 함수

▷ Calc 코드

public class Calc {
	public static int abs(int num){
		return (num>0)?num:-num;
	}
	
	public static int min(int num1, int num2){
		return (num1>num2)?num2:num1;
	}
	
	public static int max(int num1, int num2){
		return (num1>num2)?num1:num2;
	}
    
    public static double max(double num1, double num2){
		return (num1>num2)?num1:num2;
	}
    
	public static String strMax(String s1, String s2){
		return (s1.length()>s2.length())?s1:s2;
	}
	
}

 

▷ main 코드

	public static void main(String[] args) {
		System.out.println("절댓값:"+Calc.abs(-5));
		System.out.println("최솟값:"+Calc.min(4,8));
		System.out.println("최댓값:"+Calc.max(-4,8));
		System.out.println(); //줄바꿈
		
		System.out.println("실수의 최댓값:"+Calc2.max(1.5, 2.5));
		System.out.println("긴 문자열:"+Calc2.strMax("test", "test123"));
	}
  • static으로 작성된 전역 변수나 함수는 객체를 생성하지 않아도 접근이 가능하다.

 

▷ 출력 결과

절댓값:5
최솟값:4
최댓값:8

실수의 최댓값:2.5
긴 문자열:test123

 

 

 

3.  클래스 안에서 this() 이용

  • this()나 super()는 클래스의 첫 번째 줄에 작성해야 한다.

 

▶ 예제) this와 this()를 이용한 코드

public class Human {
	private String name;
	private String area;
	private String phone;
	private int age;
	
	Human(String name){
		this(name,"알수없음","알수없음",0);//중복된 내용을 작성하지 않을 수 있다.
	}
	
	Human(String name, String area){
		this(name,area,"알수없음",0);
	}
	
	Human(String name, String area, String phone){
		this(name,area,phone,0);
	}
	
	Human(String name, String area, String phone, int age){
		this.name=name;
		this.area=area;
		this.phone=phone;
		this.age=age;
	}
}

 

 

 

4. 상속과 접근 제한자

▶ 상속

  • 부모클래스에 만들어진 필드, 메소드를 자식클래스가 물려받는다.
  • 동일한 특성을 재정의할 필요가 없어 자식 클래스가 간결해진다.
  • 클래스들의 계층적 분류가 가능하며 클래스 관리에 용이하다.
  • 소프트웨어의 생산성이 향상된다.

 

▶ 접근 제한자

접근 제한자 접근 범위 동일 클래스 동일 패키지 다른 패키지의 자식 클래스(상속) 다른 패키지
public 접근제한 없음 O O O O
protected 동일 패키지
상속받은 클래스 내부
O O O  
default 동일 패키지 내에서만 접근 가능 O O    
private 동일 클래스 내에서만 접근 가능 O      

 

 

 

5. 상속과 super() 호출

▶ 예제) 상속을 이용한 생성자 호출

 TV2 클래스 코드

public class TV2 {
	TV2(){
		System.out.println("TV 기본 생성자");
	}
	
	TV2(int size){
		System.out.println("TV 파라미터 생성자");
	}
}

 

TV2를 상속받는 ColorTV 클래스 코드

public class ColorTV extends TV2{
	ColorTV(){
		System.out.println("ColorTV 기본 생성자");
	}
	
	ColorTV(int size, int color){
		System.out.println("ColorTV 파라미터 생성자");
	}
}

 

main 코드

		ColorTV hiTV = new ColorTV();

 

 출력 결과

TV 기본 생성자
ColorTV 기본 생성자
  • ColorTV 의 생성자를 호출하면 상속받는 TV2의 기본 생성자가 호출된다.
  • 서브 클래스의 생성자 맨 위에 super(); 가 생략된 형태이며, super(파라미터)를 이용하여 명시적으로 슈퍼 클래스의 생성자를 선택할 수 있다.

 

 


▶ 위 main 코드를 수정하여 ColorTV 파라미터 생성자를 호출해 보자.

 main 코드

		ColorTV hiTV = new ColorTV(32,1024);

 

 출력 결과

TV 기본 생성자
ColorTV 파라미터 생성자
  • ColorTV 의 파라미터 생성자를 호출하더라도 TV2는 기본 생성자가 호출된다.
  • TV 파라미터 생성자를 호출하고 싶다면 아래 예제를 계속 확인해 보자.

 

 


▶ ColorTV 클래스 코드를 수정하여 TV2 파라미터 생성자를 호출해 보자.

 ColorTV 클래스 코드

	ColorTV(int size, int color){
		super(5);
		System.out.println("ColorTV 파라미터 생성자");
	}
  • 호출하려는 생성자 맨 위에 super(파라미터 정수 5); 를 추가하면 작성한 파라미터와 매치되는 파라미터 생성자를 호출한다.

 

 출력 결과

TV 파라미터 생성자
ColorTV 파라미터 생성자

 

 

 

 


2023년 5월 31일 수요일

<13일차 수업 후기>

클래스를 작성할 때 보안을 위해 private를 많이 사용하고, 설정자(setXXX)와 접근자(getXXX)를 이용한 간접 접근을 많이 이용한다고 배웠다. 실무에서 주로 사용하는 방법이라고 하니 꼭 기억해야겠다.

728x90
반응형
728x90
반응형

1.  구구단에서 5단을 제외하고 출력

▶ 코드

		System.out.println("문제 1. 구구단에서 5단을 제외하고 출력하시오.\n");

		for(int i=2;i<=9;i++){
			if(i==5)
				continue; //5단은 출력X. 뒤에 내용을 생략

			System.out.println("<"+i+"단>");
			for(int j=1;j<=9;j++)
				System.out.printf("%d*%d=%2d\n",i,j,i*j);
			
			System.out.println();//줄바꿈
		}

 

▶ 출력 결과

문제 1. 구구단에서 5단을 제외하고 출력하시오.

<2단>
2*1= 2
2*2= 4
2*3= 6
2*4= 8
2*5=10
2*6=12
2*7=14
2*8=16
2*9=18

<3단>
3*1= 3
3*2= 6
3*3= 9
3*4=12
3*5=15
3*6=18
3*7=21
3*8=24
3*9=27

<4단>
4*1= 4
4*2= 8
4*3=12
4*4=16
4*5=20
4*6=24
4*7=28
4*8=32
4*9=36

<6단>
6*1= 6
6*2=12
6*3=18
6*4=24
6*5=30
6*6=36
6*7=42
6*8=48
6*9=54

//생략

 

 

 

2.  5개의 숫자를 입력받아서 배열 만들기 (단, 홀수만 배열에 들어가도록 작성)

▶ 코드

		System.out.println("문제 2. 5개의 숫자를 입력받아서 배열 만들되, 배열에는 홀수만 들어가도록 하시오.\n");

		Scanner scan = new Scanner(System.in);
		int[] arr=new int[5];

		for(int i=0;i<arr.length;i++){
			System.out.print((i+1)+"번째 배열 값을 입력하세요:");
			arr[i]=scan.nextInt();
			if(arr[i]%2==0){
				System.out.println("짝수 값이 아닌 홀수 값을 입력해주세요.\n");	//줄바꿈
				i--;
			}
		}

		//출력
		System.out.print("arr의 배열 값:");
		for(int i=0;i<arr.length;i++)
			System.out.print(arr[i]+" ");

		scan.close();

 

▶ 출력 결과

문제 2. 5개의 숫자를 입력받아서 배열 만들되, 배열에는 홀수만 들어가도록 하시오.

1번째 배열 값을 입력하세요:1
2번째 배열 값을 입력하세요:2
짝수 값이 아닌 홀수 값을 입력해주세요.

2번째 배열 값을 입력하세요:3
3번째 배열 값을 입력하세요:4
짝수 값이 아닌 홀수 값을 입력해주세요.

3번째 배열 값을 입력하세요:5
4번째 배열 값을 입력하세요:7
5번째 배열 값을 입력하세요:9
arr의 배열 값:1 3 5 7 9

 

 

 

3.   홀수→짝수 순으로 배열 정렬

▶ 실습 내용

 

[JAVA] 홀수→짝수 순으로 배열 정렬

 

deliciouscode.tistory.com

 

 

 

4.  Calculator 클래스 생성

  1. 두개의 정수를 매개변수로 받아서 곱한 값을 리턴해주는 multiple 메소드 생성
  2. 3개의 정수를 입력받아서 곱한 값을 리턴해주는 multiple 메소드 생성
  3. 4개의 실수(double)를 입력받아서 가장 큰 값을 리턴해주는 max 메소드 생성

 

Calculator 코드

public class Calculator {

	//2개의 정수를 매개변수로 받아서 곱한 값을 리턴해주는 multiple 메소드 생성
	int multiple(int num1, int num2){
		return (num1*num2);
	}
	
	
	//3개의 정수를 입력받아서 곱한 값을 리턴해주는 multiple 메소드 생성
	int multiple(int num1, int num2, int num3){
		return (num1*num2*num3);
	}
	
	
	//4개의 실수(double)를 입력받아서 가장 큰 값을 리턴해주는 max 메소드 생성
	double max(double num1, double num2, double num3, double num4){
		double max = num1<num2? num2:num1;
		max = max<num3? num3:max;
		max = max<num4? num4:max;

		return max;
		
		//double x = Math.max(num1, num2);
		//double y = Math.max(num3, num4);
		//return Math.max(x,y);
	}
}

 

▶ main 코드

		System.out.println("문제 4. Calculator 클래스를 생성하여 연산하시오.\n");
		
		Calculator calc = new Calculator();

		System.out.println("두 정수의 곱:"+calc.multiple(1, 2));
		System.out.println("세 정수의 곱:"+calc.multiple(1, 2, 3));
		System.out.println("네 개의 실수값 중 최댓값:"+calc.max(3.2, 2.5, 1.6, 0.1));

 

▶ 출력 결과

문제 4. Calculator 클래스를 생성하여 연산하시오.

두 정수의 곱:2
세 정수의 곱:6
네 개의 실수값 중 최댓값:3.2

 

728x90
반응형

'HRD_훈련 > 실습' 카테고리의 다른 글

[JAVA] TV 상속  (0) 2023.05.31
[JAVA] 심화 문제 풀이 (13일차)  (0) 2023.05.31
[JAVA] 홀수→짝수 순으로 배열 정렬  (0) 2023.05.30
[JAVA] 선택 정렬 보완  (0) 2023.05.28
[JAVA] 선택 정렬과 버블 정렬  (1) 2023.05.25

+ Recent posts