반응형

1. 오버라이딩의 조건

자손클래스에서 오버라이딩하는 메서드는 조상 클래스의 메서드와
- 이름이 같아야 한다. 
- 매개변수가 같아야 한다.
- 반환타입이 같아야 한다.
 조상 클래스의 메서드를 자손 클래스에서 오버라이딩 할때
1. 접근 제어자를 조상 클래스의 메서드 보다 좁은 범위로 변경할 수 없다.
2. 예외는 조상 클래스의 메서드보다 많이 선언할 수 없다. 혹은 상우의 예외(Exception)으로 선언할 수 없다. 
3. 인스턴스메서드를 static메서드로 또는 그 반대로 변경할 수 없다.

2. 오버로딩 vs 오버라이딩

오버로딩: 기존에 없는 새로운 메서드를 정의하는 것
오버라이딩: 상속받은 메서드의 내용을 변경하는 것

 

 

출처: 자바의 정석

반응형

OkHttp 라이브러리를 이용해서 유저정보를 호출했다.

OkHttpClient client2 = new OkHttpClient().newBuilder()
                .build();
Request request3 = new Request.Builder()
                .url("https://panasonic1.talentlms.com/api/v1/users/id:"+userBean.getUser_id())
                .method("GET", null)
                .addHeader("Authorization", "Basic RFRDejRxWVI1eE1RemNwQjVVbktQWTFpZHNzR0lwOg==")
                .addHeader("Cookie", "AWSALB=BMrb5JNU1MJMwLUZDnqSqyGhxcUQwfYVos2nthPQ8EU+41COg65UeDedxNZeQsw0gfeqPKKhI2VTDxw2HIiqqPe6T+Oi57IY/EtEOKraj9oPqNn2QFF1f0Dtr9rFhVWKfu1vfkBCTNIVRxXnGKDXBYFWXNtcBP+YYLb5PSTukcAb+6z2cWgqaD4XnwfJhw==; AWSALBCORS=BMrb5JNU1MJMwLUZDnqSqyGhxcUQwfYVos2nthPQ8EU+41COg65UeDedxNZeQsw0gfeqPKKhI2VTDxw2HIiqqPe6T+Oi57IY/EtEOKraj9oPqNn2QFF1f0Dtr9rFhVWKfu1vfkBCTNIVRxXnGKDXBYFWXNtcBP+YYLb5PSTukcAb+6z2cWgqaD4XnwfJhw==; PHPSESSID=elb~qdoi8nqik68t0jrc2hnkkma6om")
                .build();

Response response3 = client.newCall(request3).execute();

response3의 객체정보를 print했더니

System.out.println(response3.getClass().getName());

-> okhttp3.Response 즉 Response 타입인 것을 확인했다.
이 Response형을 String형으로 변환하고 다시 json형으로 변환한다.

//Response형 -> String형
String userString = response3.body().string();

// String형 ->json형
JSONObject userJson = new JSONObject(userString);

 
이렇게 얻은 json형의 유저정보를 출력하면

 System.out.println(userJson);
{"login_key":
"4710239847209318479028314790821347",
"timezone":"(GMT +09:00) Osaka, Sapporo, Tokyo, Japan","bio":"",
"language":"Korean",
"login":"tester",
"deactivation_date":"",
"points":"75",
"custom_field_12":"tester",
"user_type":"Learner-Type",
"custom_field_10":"tester",
"custom_field_11":"tester",
"last_updated_timestamp":"1637067730",
"id":"108",
"first_name":"tester",
"email":"tester@naver.com",
"courses":[{"completion_percentage":"0","role":"learner","expired_on_timestamp":null,"completed_on":"","completed_on_timestamp":null,"enrolled_on_timestamp":"1636445395","last_accessed_unit_url":"https://panasonic1.talentlms.com/course/lastaccessedunit/course_id:131,user_id:108","total_time_seconds":62,"enrolled_on":"09/11/2021, 17:09:55","name":"IPD(화상처리기)","completion_status":"incomplete","id":"131","total_time":"1m 2s","completion_status_formatted":"In progress","expired_on":""},
			{"completion_percentage":"0","role":"learner","expired_on_timestamp":null,"completed_on":"","completed_on_timestamp":null,"enrolled_on_timestamp":"1636600560","last_accessed_unit_url":"https://panasonic1.talentlms.com/course/lastaccessedunit/course_id:130,user_id:108","total_time_seconds":0,"enrolled_on":"11/11/2021, 12:16:00","name":"PLC","completion_status":"not_attempted","id":"130","total_time":null,"completion_status_formatted":"Not started","expired_on":""},
            {"completion_percentage":"0","role":"learner","expired_on_timestamp":null,"completed_on":"","completed_on_timestamp":null,"enrolled_on_timestamp":"1635832492","last_accessed_unit_url":"https://panasonic1.talentlms.com/course/lastaccessedunit/course_id:126,user_id:108","total_time_seconds":0,"enrolled_on":"02/11/2021, 14:54:52","name":"강의_ 대리점용","completion_status":"not_attempted","id":"126","total_time":null,"completion_status_formatted":"Not started","expired_on":""},
            {"completion_percentage":"0","role":"learner","expired_on_timestamp":null,"completed_on":"","completed_on_timestamp":null,"enrolled_on_timestamp":"1635818888","last_accessed_unit_url":"https://panasonic1.talentlms.com/course/lastaccessedunit/course_id:127,user_id:108","total_time_seconds":0,"enrolled_on":"02/11/2021, 11:08:08","name":"강의_본사용","completion_status":"not_attempted","id":"127","total_time":null,"completion_status_formatted":"Not started","expired_on":""}],"last_updated":"16/11/2021, 22:02:10","level":"1","last_name":"han","groups":[{"name":"test_Group","id":"34"}],
 "avatar":"https://d3j0t7vrtr92dk.cloudfront.net/images/default_user.png",
 "custom_field_9":"tester",
 "branches":[],
 "certifications":[],
 "badges":[{"image_url":"https://d3j0t7vrtr92dk.cloudfront.net/images/badges/set1/activity/1.png","criteria":"4 logins","issued_on_timestamp":1635818957,"name":"Activity Newbie","issued_on":"02/11/2021, 11:09:17","type":"activity","badge_set_id":"1"},{"image_url":"https://d3j0t7vrtr92dk.cloudfront.net/images/badges/set1/activity/2.png","criteria":"8 logins","issued_on_timestamp":1635832042,"name":"Activity Grower","issued_on":"02/11/2021, 14:47:22","type":"activity","badge_set_id":"1"}],"created_on":"01/11/2021, 15:11:05","restrict_email":"0","status":"active"
 }

-> 다음과 같은 유저정보가 json 형식으로 나온다.

이제부터 할 것은
1) 이 json데이터에서 특정정보(강의)만을 추출해서 array형태로 변환후
2) 반복문을 돌리며 강의 번호, 강의명, 강의 url를 출력할 것이다.

1) 강의 정보만 추출하기

 //json에서 배열가져오기
 JSONArray courses = userJson.getJSONArray("courses");
 System.out.println(courses);

출력결과

[{"completion_percentage":"0","role":"learner","expired_on_timestamp":null,"completed_on":"","completed_on_timestamp":null,"enrolled_on_timestamp":"1636445395","last_accessed_unit_url":"https://panasonic1.talentlms.com/course/lastaccessedunit/course_id:131,user_id:108","total_time_seconds":62,"enrolled_on":"09/11/2021, 17:09:55","name":"IPD(화상처리기)","completion_status":"incomplete","id":"131","total_time":"1m 2s","completion_status_formatted":"In progress","expired_on":""},
{"completion_percentage":"0","role":"learner","expired_on_timestamp":null,"completed_on":"","completed_on_timestamp":null,"enrolled_on_timestamp":"1636600560","last_accessed_unit_url":"https://panasonic1.talentlms.com/course/lastaccessedunit/course_id:130,user_id:108","total_time_seconds":0,"enrolled_on":"11/11/2021, 12:16:00","name":"PLC","completion_status":"not_attempted","id":"130","total_time":null,"completion_status_formatted":"Not started","expired_on":""},
{"completion_percentage":"0","role":"learner","expired_on_timestamp":null,"completed_on":"","completed_on_timestamp":null,"enrolled_on_timestamp":"1635832492","last_accessed_unit_url":"https://panasonic1.talentlms.com/course/lastaccessedunit/course_id:126,user_id:108","total_time_seconds":0,"enrolled_on":"02/11/2021, 14:54:52","name":"강의_ 대리점용","completion_status":"not_attempted","id":"126","total_time":null,"completion_status_formatted":"Not started","expired_on":""},
{"completion_percentage":"0","role":"learner","expired_on_timestamp":null,"completed_on":"","completed_on_timestamp":null,"enrolled_on_timestamp":"1635818888","last_accessed_unit_url":"https://panasonic1.talentlms.com/course/lastaccessedunit/course_id:127,user_id:108","total_time_seconds":0,"enrolled_on":"02/11/2021, 11:08:08","name":"강의_본사용","completion_status":"not_attempted","id":"127","total_time":null,"completion_status_formatted":"Not started","expired_on":""}]

: 다음과 같이 강의 정보들만 잘 출력됐다.

2) 강의번호, 강의명, 강의 url만 출력하기

  for(int i =0; i <courses.length(); i++){

      JSONObject object  = courses.getJSONObject(i);

      String course_id = object.getString("id");
      String name = object.getString("name");
      String url = object.getString("last_accessed_unit_url");

      System.out.println(course_id);
      System.out.println(name);
      System.out.println(url);

}

출력결과:

130
PLC
https://panasonic1.talentlms.com/course/lastaccessedunit/course_id:130,user_id:108
126
강의_ 대리점용
https://panasonic1.talentlms.com/course/lastaccessedunit/course_id:126,user_id:108
127
강의_본사용
https://panasonic1.talentlms.com/course/lastaccessedunit/course_id:127,user_id:108

 

다음과 같이 강의정보만 잘 출력됐다!

'Study > JAVA' 카테고리의 다른 글

[JAVA] 오버로딩, 오버라이딩  (0) 2022.11.05
[Java] 접근제어자  (0) 2020.06.18
[JAVA] 재귀함수  (0) 2020.06.15
[Java] 조건문 문제풀기-2  (0) 2020.06.15
[JAVA] 조건문 문제풀기  (0) 2020.06.15
반응형
public: 아무런 제약 없이 모든 접근이 허용된다.
protected: 같은 패키지의 객체와 상속 관계에 있는 객체까지만 접근이 허용된다.
default:  해당 패키지 내에서만 접근이 허용된다.
private: 해당 class 내에서만 접근이 허용된다. 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
 
public class AccessModifier {
    
    public static void main(String[] args) {
        
        Wallet myWallet = new Wallet(10000);
        
        myWallet.myMoney -= 2200;
        
        myWallet.checkMyMoney();
    }
}    
    
    class Wallet {
        int myMoney;
        
        public Wallet(int myMoney) {
            this.myMoney = myMoney;                    
        }
        
        public void pay(int payMoney) {
            this.myMoney -= (int)(payMoney *1.1);
        }
        
        public void  checkMyMoney() {
            System.out.println("남은 돈: " + this.myMoney);
        }
        
    }
 
 
 
 
cs

8라인을보면 pay메소드를 활용하지 않고 직접 myMoney에 접근해서 시스템에 의한 지불이 아닌 임의의 지불을 처리했다.
처리되는건 맞지만 시스템에 의한 지불처리가 아니기 때문에 myMoney의 정보를 신뢰할 수 없다. 

그렇기 때문에 pay메소드를 통해 처리되게 해야한다. 
Wallet의 멤버 변수 myMoney는 클래스 내부에서만 접근할 수 있어야한다. 그래서 접근 제어자로 'private'을 사용하여
해당 클래스 내에서만 접근할 수 있게 한다. 
생성자나 pay메소드, checkMyMoney메소드는 외부에서 접근할 수 있도록 public 으로 한다. 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
 
public class AccessModifier {
    
    public static void main(String[] args) {
        
        Wallet myWallet = new Wallet(10000);
        
        //myWallet.myMoney -= 2200;
        myWallet.pay(2200);
        
        myWallet.checkMyMoney();
    }
}    
    
    class Wallet {
        private int myMoney;
        
        public Wallet(int myMoney) {
            this.myMoney = myMoney;                    
        }
        
        public void pay(int payMoney) {
            this.myMoney -= (int)(payMoney *1.1);
        }
        
        public void  checkMyMoney() {
            System.out.println("남은 돈: " + this.myMoney);
        }        
    }
 
 
cs

 

남은 돈: 7580

                                                                          

반응형

재귀함수는 메소드 내에서 스스로를 반복적으로 호출하여 처리한다.
단, 무한으로 반복되는 형태가 아닌, 반복의 끝이 반드시 존재한다는 조건이 있어야 한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package chap08.Sample03;
 
public class sample6 {
    static int sum;
 
    public static int sum(int a) {
        sum += a;
        if (a == 0) {
            return sum;
        } else {
            a--;
            return sum(a);
        }
    }
 
    public static void main(String[] args) {
        // 메서드의 인자값 보다 적은 모든 정수의 합
        System.out.println(sum(10));
    }
}
cs

소스코드에서는 10을 인자로 넘겼으며 10을 sum이라는 멤버 변수에 값을 담고 인자값이 0이면 종료시키고 0이 아니면 값을 하나씩 감소시켜서 현재 실행중인 메소드를 0이 될때 까지 계속해서 호출함.

반응형
1~5 사이에 있는 임의의 수를 키보드로 부터 입력해서 몇 번만에 맞추는 지알아보는 프로그램을 작성하시오.
import java.util.Arrays;
import java.util.Scanner;

public class Sample1 {
	public static void main(String[] args) {
		// 1~5 사이에 있는 임의의 수를 키보드로 부터 입력해서 몇 번만에 맞추는 지알아보는 프로그램을 작성하시오.
		System.out.print("1~5 사이의 수를 입력하세요: ");
		int com = (int)(Math.random()*5+1);
		
		Scanner sc = new Scanner(System.in);
		int i = 1;
		
		while(sc.hasNext()) {
			
			int input = sc.nextInt();
			if(input == com) {
				System.out.println(i + "번째 만에 맞췄습니다.");
				break;
			}else {
				System.out.println("틀렸습니다. 다시 입력해주세요");
			}
			i++;			
		}
	}
}
1~5 사이의 수를 입력하세요: 1
틀렸습니다. 다시 입력해주세요
2
틀렸습니다. 다시 입력해주세요
3
틀렸습니다. 다시 입력해주세요
4
틀렸습니다. 다시 입력해주세요
5
5번째 만에 맞췄습니다.

'Study > JAVA' 카테고리의 다른 글

[Java] 접근제어자  (0) 2020.06.18
[JAVA] 재귀함수  (0) 2020.06.15
[JAVA] 조건문 문제풀기  (0) 2020.06.15
[Java] 조건문  (0) 2020.06.10
[Java] Arrays 클래스  (0) 2020.06.08

+ Recent posts