자바 프로그래밍 언어: 클래스와 배열 [2]
[클래스와 객체의 개념 9]
● 메서드 오버로딩
▶Over loading(중복정의)이라는 것은 하나의 클래스 내에서 같은 이름을 가지는 메서드(멤버함수)가 여러 개 정의되는 것을 말한다. 이것을 컴파일 시 컴파일러에 의해 각 메서드들이 구별되며 기준은 인자가 된다.
[접근 제한 [반환형] - 교체 가능
[메서드명] 반드시 동일
(자료형 인자 1, 자료형 인자 2,...) 반드시 다르게
이런 Over loading기법이 필요한 이유는 같은 목적으로 비슷한 동작을 수행하는 메서드(멤버 함수)들을 모아 이름을 같게 하면 프로그래머로 하여금 다양한 메서드들을 같은 이름으로 일관된 작업을 할 수 있다는 편리함이 있다.
예제: OverloadingTest1.java
01 class OverloadingTest1{
02
03 public void intLength(int a){
04 String s = String.valueOf(a);
05 System.out.println("입력한 값의 길이 : "+s.length());
06 }
07 public void floatLength(float f){
08 String s = String.valueOf(f);
09 System.out.println("입력한 값의 길이 : "+s.length());
10 }
11 public void stringLength(String str){
12 System.out.println("입력한 값의 길이 : "+str.length());
13 }
14 public static void main(String[] args) {
15 OverloadingTest1 ot1 = new OverloadingTest1();
16
17 ot1.intLength(1000);
18 ot1.floatLength(3.14f);
19 ot1.stringLength("10000");
20 }
21 }
예제: OverloadingTest2.java
01 class OverloadingTest2{
02
03 public void getLength(int n){
04 String s = String.valueOf(n);
05 getLength(s);
06 }
07 void getLength(float n){
08 String s = String.valueOf(n);
09 getLength(s);
10 }
11 private int getLength(String str){
12 System.out.println("입력한 값의 길이 : "+str.length());
13 return 0;
14 }
15 public static void main(String[] args) {
16 OverloadingTest2 ot2 = new OverloadingTest2();
17
18 ot2.getLength(1000);
19 ot2.getLength(3.14f);
20 ot2.getLength("10000");
21 }
22 }
7번과 11번 행에서 알 수 있듯이 Overloading에 있어 [접근 제한]과 [반환영] 그리고 인자의 이름은 아무런 영향력을 미치지 못한다. 메서드명이 같은 여러 개의 메서드를 구별하는 방법은 메서드에 사용되는 인자의 자료형 또는 인자의 수 아니면 인자들의 배치가 서로 달라야 각 메서드들을 구별할 수 있다는 것을 명심하자!
[클래스와 객체의 개념 10]
● 생성자
▶ 생성자라는 것은 메모리상에 객체가 생성될 때 자동적으로 단 한 번 호출되어 객체의 구조를 인식하게 하고 생성되는 객체의 멤버 변수들을 초기화하는데 목적을 둔 것을 말한다.
▶생성자의 특징
1) return type이 전혀 정의되지 않는다
2) 생성자의 이름이 클래스 명과 같아야 한다.
▶생성자의 구성
[접근 제한] [생성자명] (자료형 인자 1, 자료형 인자 2,...){
수행문 1;
수행문 2;
}
▶ 생성자의 필요성: 특정 클래스가 생성될 때마다 가지는 instance변수가 있어 항상 값을 설정해야 하는 번거로움이 있다면 생성자를 이용하여 1차적으로 초기화 작업을 거치면서 객체를 생성된다면 좀 더 편리할 것이다.
class MyClass1{
private String name;
public MyClass1(String n){
name = n;
}
public void setName(String n){
name = n;
}
}
▶ 생성자 접근 제한의 의미: 생성자의 접근 제한에도 앞서 설명한 접근 제한자(Access Modifiers)를 똑 같이 사용한다. public과 protected 그리고 defalut와 private의 의미적 차이는 없으며 클래스의 접근 제한과 생성자의 접근 제한은 별도의 제한력을 가지다는 것이 중요하다.
▶ 생성자 오버로딩: 생성자의 Overloading은 객체를 생성할 수 있는 방법의 수를 제공하는 것과 같으며 앞서 배운 메서드 오버 로딩 법과 다를 것이 없어 각 생성자의 구분 또한 인자로 구별함을 잊지 말자!
예제: MyClass2.java
01 class MyClass2{
02
03 private String name;
04 private int age;
05 public MyClass2(){
06 name = “www.sist.co.kr”;
07 }
08 public MyClass2(String n){
09 name = n;
10 }
11 public MyClass2(int a, String n){
12 age = a;
13 name = n;
14 }
15 public MyClass2(String n, int a){
16 age = a;
17 name = n;
18 }
19 public String getName(){
20 return name;
21 }
22 public int getAge(){
23 return age;
24 }
25 }
예제: MyClass2Test.java
01 class MyClass2Test{
02
03 public static void main(String[] args)
04 {
05 MyClass2 mc1 = new MyClass2();
06 MyClass2 mc2 = new MyClass2("아라치");
07 MyClass2 mc3 =
new MyClass2("마루치",46);
08 MyClass2 mc4 =
new MyClass2(23,"오자바");
09
10 System.out.println(mc1.getName()+","+
mc1.getAge());
11 System.out.println(mc2.getName()+","+
mc2.getAge());
12 System.out.println(mc3.getName()+","+
mc3.getAge());
13 System.out.println(mc4.getName()+","+
mc4.getAge());
14 }
15 }
[클래스와 객체의 개념11]
● this 와 this()
▶ this : 객체 내부에서 객체 자신을 칭하고 싶을 때나 아니면 지역변수와 멤버 변수를 구별해야 할 때도 있을 것이다. 이럴 때 사용하는 객체 자신을 가리킬 수 있는 유일한 reference! 이것이 바로 this이다
▶ this() : 이것은 현재 객체의 생성자를 의미하는 것이다. 주의해야 할 점은 생성자의 첫 행에 정의해야 한다는 것이며 그렇지 않으면 Compile시 오류가 발생한다. 다시 말하면 이 this()를 이용하여 한 클래스 내의 특정 생성자에서 Overloading 되어 있는 다른 생성자를 호출할 수 있는 것이다. 그렇게 함으로 해서 생성자에게 코딩 내용이 중복되는 부분을 막을 수 있다.
● static예약어
▶ static 예약어는 메서드나 멤버 변수에 정의 할 수 있으며 지역변수나 클래스에게는 정의 할 수 없다. 메서드나 멤버변수에 static이라는 예약어를 정의하면 static에서 (클래스 메서드)와 static변수(클래스 변수)라고 불리게 된다. 이유는 멤버 변수나 메서드들은 해당 객체가 생성될 때 객체가 생성된 메모리 공간에 같이 존재하게 되지만 static으로 선언된 메서드나 변수들은 static영역(메서드 영역)이라는 곳에 유일하게 만들어지면서 모든 객체(Object)들이 사용할 수 있도록 공유개념을 가지기 때문이다.
[기본 클래스 익히기 1]
● String 클래스
문자열 객체
문자열 수정 불가능(불변적 특징)
+ 연산자를 이용하여 새로운 문자열 객체 생성
String str3 = str1 + str2;
▶주요 생성자
String 클래스 생성 방법
암시적 객체 생성: String s1 = "www.tistory.com";
명시적 객체 생성: String s2 = new String("www.tistory.com");
String클래스 예제: StringEx1.java
01 class StringEx1{
02
03 public static void main(String[] args){
04 String s1 = "Twinkle"; //암시적 객체생성
05 String s2 = "Twinkle"; //암시적 객체생성
06 if(s1 == s2) //==연산자로 객체를 비교시에는 참조 값(주소)비교
07 System.out.println("s1과 s2는 같다. ");
08 else
09 System.out.println("s1과 s2는 같지 않다. ");
10
11 String s3 = new String("Little Star"); //명시적 객체 생성
12 String s4 = new String("Little Star"); //명시적 객체 생성
13 if(s3 == s4)
14 System.out.println("s3과 s4는 같다. ");
15 else
16 System.out.println("s3과 s4는 같지 않다. ");
17 }
18 }
실행결과
s1과 s2는 같다.
s3과 s4는 같지 않다.
[기본 클래스 익히기 2]
● StringBuffer 클래스
문자열 버퍼 객체
문자열 추가 변경 가능
append() 메서드를 이용하여 문자(열) 추가
str1.append(str2);
▶주요 생성자
StringBuffer 클래스의 주요 생성자
StringBuffer() : 비어있는 StringBuffer 객체를 생성하고 초기값으로 문자 16자를 기억할 수 있는 용량(buffer의 길이)을 가진다.
StringBuffer(CharSequence seq) : 현재 인자로 전달된 특정한 CharSequence와 같은 문자열을 포함한 StringBuffer 객체를 생성한다.
StringBuffer(int capacity) : 현재 인자로 들어온 capacity이라는 값으로 새롭게 생성될 StringBuffer객체의 용량(buffer의 길이)으로 초기화하여 생성한다.
StringBuffer(String str) : 현재 인자로 전달된 문자열 str을 초기값으로 하여 StringBuffer 객체를 생성한다. 이때 용량(buffer의 길이)은 str의 길이+16이다.
StringBuffer 클래스 예제: StringBufEx2.java
01 class StringBufEx2{
02
03 public static void main(String[] args){
04
05 StringBuffer sb1 = new StringBuffer("Sun-Ae"); //StringBuffer 객체생성
06 StringBuffer sb2 = sb1.append(" & Kyung-Ju"); //문자열 추가
07
08 String msg = null;
09 if(sb1 == sb2) //문자열이 추가되고 참조 값(주소)는 변함이 없다.
10 msg = "sb1와 sb2는 같다.";
11 else
12 msg = "sb1와 sb2는 다르다.";
13 System.out.println(msg);
14 msg = sb1.toString();
15 System.out.println("sb1 : " + msg);
16 msg = sb2.toString();
17 System.out.println("sb2 : " + msg);
}
19 }
실행결과:
sb1와 sb2는 같다
sb1 : Sun-Ae & Kyung-Ju
sb2 : Sun-Ae & Kyung-ju
[기본 클래스 익히기 3]
● StringTokenizer 클래스
문자열 분리 객체
nextToken() 메서드를 이용하여 문자(열) 분리
String token = st1.nextToken();
▶ StringTokenizer 클래스의 주요 생성자
StringTokenizer(String str): 현재 인자로 전달된 String 객체인 str을 기본 구분 문자인 white space, new line, tab 등의 구분 문자로 하여 분할할 StringTokenizer 객체를 생성한다.
StringTokenizer(String str, String delim): 현재 인자로 전달된 String 객체인 str을 두 번째 인자인 delim으로 구분문자로 하여 분할할 StringTokenizer 객체를 생성한다.
StringTokenizer(String str, String delim, boolean returnDelims): 현재 인자로 전달된 String 객체인 str을 두 번째 인자인 delim으로 구분 문자로 하여 분할할 StringTokenizer 객체가 생성될 때 세 번째 인자인 boolean형에 의해 delim 또한 token 자원으로 사용할 것인지를 결정하게 된다.
StringTokenizer 클래스 예제: StringTokenEx1.java
01 import java.util.StringTokenizer;
02 class StringTokenEx1{
03
04 StringTokenizer st;
05 public StringTokenEx1(String str){
06 System.out.println("str : " + str);
07 st = new StringTokenizer(str);
08 }
09 public StringTokenEx1(String str, String delim){
10 System.out.println("str : " + str);
11 st = new StringTokenizer(str, delim);
12 }
13
14 public void print(){
15 System.out.println("Token count : " + st.countTokens());
16 while(st.hasMoreTokens()){
17 String token = st.nextToken();
18 System.out.println(token);
19 }
20 System.out.println("-----------------------------");
21 }
22 public static void main(String[] args) {
23
24 StringTokenEx1 st1 =
new StringTokenEx1("Happy day");
25 st1.print();
26
27 StringTokenEx1 st2 =
new StringTokenEx1("2005/08/15","/");
28 st2.print();
29 } //end main
30 } // end class
실행결과
str : Happy day
Token count : 2
Happy
day
-----------------------------------
str : 2005/08/15
Token count : 3
2005
08
15
-----------------------------------
'처음배우는 IT' 카테고리의 다른 글
자바프로그래밍 언어: 클래스Ⅱ<1> (0) | 2020.12.30 |
---|---|
자바프로그래밍 언어: 클래스와 배열 [3] (0) | 2020.12.28 |
자바프로그래밍 언어: 클래스와 배열 [1] (0) | 2020.12.26 |
자바프로그래밍 언어: 주석문과 제어문 (0) | 2020.12.23 |
자바 프로그래밍 기초: 자바 기본 문법 (0) | 2020.12.21 |