728x90

참고 영상 :

https://youtu.be/jVw3Khxeluk?si=n7cLIuq0EY66m_h2

 

참고 사이트 :

https://qiita.com/Conabuku/items/d077ef0b19845f29ebc7

 

コーポレートエンジニアのキャリア形成論 - Qiita

サマリー この記事は、コーポレートエンジニアという職種に触れ、彼らが日々直面する挑戦、不安、そして、成長の機会を考えることにします。。コーポレートエンジニアリングの世界は、

qiita.com

 

 


1. 코퍼레이트 엔지니어의 정의와 미션

  • 코퍼레이트 엔지니어는 '회사 비즈니스 전략과 IT를 연결하는 전문가'
  • 주요 역할: 사내 시스템(네트워크, 서버, 업무시스템 등) 설계, 운영, 관리, 비즈니스 프로세스 개선(자동화, 효율화)으로 조직 성장·경쟁력 강화
  • 단순 기술자에 머무르지 않고 "비즈니스의 심장부"에 관여, 기술적 시각과 경영적 시각을 지도력 있게 융합해야 함

2. 커리어에서 마주치는 현실과 불안

  • 코퍼레이트 엔지니어 경력의 한계:
    • 사내 고유 업무‧시스템을 오래 다루면 그 경험이 "특정 회사·도메인에만 국한"
    • 외부 SI, 개발 쪽 전문가처럼 다양한 프로젝트/기술을 직접 체험하기 어려움
    • 최신 기술 도입·교육은 예산, 업무환경상 늦어지는 경우 잦음
    • 일 자체가 '사내 안정/운영'에 치중하여 신기술/혁신 영역에 뒤처지기 쉬움
    • 업무가 한정돼서 "스스로 성장하는 느낌이 약하다"는 고민 흔함

3. 코퍼레이트 엔지니어의 해법·마인드·강점

  • 그럼에도 불구하고, 기업 내 IT 핵심으로서 비즈니스 전략 달성에 직접적인 '영향력'과 '주도권'을 가질 수 있음
  • "업무 프로세스 이해"와 "조직横断 커뮤니케이션"에서 얻는 경험은 어디서도 대체 불가
  • 엔지니어로서 갖추어야 할 주요 7대 스킬:
    ① 벤더 관리 ② 시스템·소프트웨어 운영 ③ 정보보안 ④ 인프라 설계/관리 ⑤ 데이터 분석基반 ⑥ 세일즈(설득) 스킬 ⑦ 커뮤니케이션
  • 기술력만 Important하지 않음!
    • 회사 내에서 의사결정권자(비IT조직 포함)와 협업/설득하는 역량
    • 개선안 제시부터 실제 정착까지 추진하는 실행력과 문제해결 능력

4. 기타(주요 비교, 문제의식)

  • SIer, 외부 전문개발자와 비교해 '유연성/스킬 업데이트'에 제약이 많으나, 반대로 "현장과 밀착"‧"조직 내 영향 증대"라는 독자적 가치·경로가 있음
  • 시장에서의 최신 기술 습득이 어렵지만, 반대로 비즈니스 중심의 IT 리더·관리직으로 커리어 전환 가능성이 높음
  • 여러 부서, 현장과 교류하면서 인적 자산, 사업 프로세스에 대한 총체적 이해가 커지는 것이 큰 장점

결론(핵심 메시지)

  • 코퍼레이트 엔지니어는 단순한 IT 잡무 담당자가 아닌, "비즈니스와 IT의 가교"
  • 단점: 기술적으로는 좁아질 수 있지만, 조직 내 실질 영향력·리더십, 종합적 비즈니스 추진 경험이 쌓임
  • IT 베이스 + 문제해결능력 + 커뮤니케이션/리더십을 바탕으로 회사 내에서 '기술을 통한 변화'를 주도할 수 있다면 특별한 가치를 가질 수 있음

 


단기 업무 (즉, 평소에 매일 자주 하게 될 일)

  • 헬프데스크 역할: 사내 직원들의 문의에 대응
    • 사용자 상담: “이거 안 돼요, 어떻게 하나요?” 스타일의 즉석 질문을 받고 해결
    • PC 관련 모든 트러블(고장, 오류, 소프트웨어 문제 등) 대응
    • 소프트웨어나 시스템, 기기 사용법 안내
  • 키팅: 신규 입사자 PC 설정, 장비 세팅·배포
  • 시스템 보수·운영: 네트워크, 서버, IT장비 정상작동 점검·간단한 유지관리

장기 업무 (프로젝트성, 기간을 갖고 진행하는 일)

  • 프로젝트 로드맵 작성: IT 관련 신규 프로젝트(시스템 개편, 자동화 등) 계획 수립
  • 정보수집: 최신 IT, 보안, AI, SaaS 트렌드 파악 및 관련 정보 분석
  • 최신 툴/서비스 도입: 사내에 필요하다고 판단되는 새로운 서비스(AI, SaaS, 보안 시스템 등) 도입 검토 및 적용
  • 기존 업무의 정보화: 기존 사무 프로세스, 시스템을 효율적으로 바꿀 수 있도록 정보화 진행
  • 외부 벤더와의 미팅: 장비/시스템 공급사 등 외부 전문가와 협업, 기술 상담, 네고 등

현실적인 요약

  • 단기(일상)는 '잡무'와 사내 IT서포트(문제 해결, PC 설정, 사용법 안내)가 주 업무
  • 장기적으로는 회사 전반의 IT 환경 개선, 새로운 서비스 도입, 효율화, 외부 협력 등 조금 더 "주도적"인 변화 업무가 있음
728x90
Proxy : 대리

 

Proxy는 JavaScript에서 객체의 기본 동작(예: 속성 접근, 할당, 열거, 함수 호출 등)을 사용자 정의 동작으로 가로채서(trap) 조작할 수 있게 해주는 기능입니다.

즉, 객체에 대한 작업을 가로채서 그 작업이 수행되기 전, 수행된 후, 또는 작업을 완전히 대체하여 추가적인 로직을 실행할 수 있게 해줍니다. 이런 특징 때문에 Proxy는 다양한 고급 작업과 패턴에 유용하게 사용될 수 있습니다.

 

const target = {
  message1: "hello",
  message2: "everyone",
};

const handler1 = {};

const proxy1 = new Proxy(target, handler1);

proxy1.message1 = 'hi';
console.log('target', target);

위의 코드에서 target의 message1 속성의 값은 hi로 변경되게 된다.

 

아래 예제를 통해 Proxy로 할 수 있는 다양한 가능성을 살펴보겠다.

1. 속성 읽기 접근 제어

속성을 읽을 때마다 로그를 출력하도록 합니다. get은 속성값을 가져오기 위한 trap(가로채기)이다.

(...)
const handler1 = {
  get(target, prop, receiver) {
    console.log(`속성 '${prop}'에 접근함`);
    return Reflect.get(...arguments);
  }
};

const proxy1 = new Proxy(target, handler1);

console.log(proxy1.message1); // 속성 'message1'에 접근함 -> hello
console.log(proxy1.message2); // 속성 'message2'에 접근함 -> everyone

Proxy는 반드시 new 키워드로만 생성가능하다.

 

2. 속성 쓰기 접근 제어

속성에 값을 할당할 때 유효성 검사를 추가합니다. 예를 들어, message1에는 오직 문자열만 할당될 수 있게 합니다.

(...)
const handler1 = {
    set(target, prop, value) {
        if (prop === "message1" && typeof value !== "string") {
            throw new Error("message1은 문자열이어야 합니다.");
        }
        target[prop] = value;
        return true; // 성공적으로 값을 할당했음을 나타냄
    }
};

const proxy1 = new Proxy(target, handler1);

proxy1.message1 = "안녕하세요"; // 성공
try {
    proxy1.message1 = 123; // Error: message1은 문자열이어야 합니다.
} catch (e) {
    console.error(e.message);
}

 

3. 속성 존재 여부 확인

객체에 특정 속성이 있는지 확인할 때마다 로그를 출력합니다.

const handler1 = {
  has(target, prop) {
    console.log(`${prop} 속성이 객체에 존재하는지 확인`);
    return prop in target;
  }
};

const proxy1 = new Proxy(target, handler1);

console.log('message1' in proxy1); // message1 속성이 객체에 존재하는지 확인 -> true
console.log('message3' in proxy1); // message3 속성이 객체에 존재하는지 확인 -> false

 

이외에도 다양한 Handler Function을 통해 객체의 기본동작을 정의하고 유연하게 사용할 수 있다.

 

Proxy생성자와 Handler Function에 대해서는 다음 문서를 참고

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy/Proxy

 

Proxy() constructor - JavaScript | MDN

The Proxy() constructor creates Proxy objects.

developer.mozilla.org

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

[JavaScript] 기본  (0) 2021.10.18
html + javascript 기초  (0) 2021.01.07
자바스크립트 - 의사 결정  (0) 2017.03.28
자바 스크립트 기초 - 함수, 메서드, 객체  (0) 2017.03.27
728x90

Symbol

A JavaScript Symbol is a primitive datatype just like Number, String, or Boolean.  

It represents a unique "hidden" identifier that no other code can accidentally access.  

For instance, if different coders want to add a person.id property to a person object belonging to a third-party code, they could mix each others values.  Using Symbol() to create a unique identifiers, solves this problem:

 

ES6에 추가된 타입.

심볼은 유일하고 변경할 수 없는 타입으로, 객체의 프로퍼티를 위한 식별자로 사용할 수 있습니다.

 

typeof 

피연산자 타입을 반환   

 

객체 프로퍼티 참조

객체이름.프로퍼티이름
or
객체이름["프로퍼티이름"]

 

[에시코드]

<!DOCTYPE html>
<html lang="ko">

<head>
  <meta charset="UTF-8">
  <title>JavaScript DataType</title>
</head>

<body>

  <h1>심볼 타입</h1>
  <p id="result"></p>

  <script>
    const p = { name: 'Doe' }
    var sym = Symbol("Age");		// 심볼 타입
    p[sym] = 17
    var symObj = Object(sym); 			// 객체 타입

    document.getElementById("result").innerHTML = (typeof sym) + "<br>" + (typeof symObj);
    console.log(p)

  </script>

</body>

</html>

결과

 

 

Call stack, Callback Queue, Event-loop

console.log('1')
    setTimeout(() => {
      console.log('2')      
    }, 0);
    setTimeout(() => {
      console.log('3')      
    }, 0);
    console.log('4')
    // call stack:호출된 함수들의 스택, event-loop는 콜스택이 완전히 빌때까지는 다음 콜백을 처리하지 않음
    // callback queue(MessageQue)는 앞으로 실행할 콜백(함수와 그 인자)을 쌓아두는 큐
    // event : fileI/O, network..

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

[JavaScript] Proxy  (0) 2024.04.03
html + javascript 기초  (0) 2021.01.07
자바스크립트 - 의사 결정  (0) 2017.03.28
자바 스크립트 기초 - 함수, 메서드, 객체  (0) 2017.03.27
728x90

 

finally 블록을 추가하면 try문에서 return을 해도 무조건 실행된다!

public class Ex4 {

	public static void main(String[] args) {
		try {
			inputScore(101);
		} catch (InvalidScoreException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	// throws로 예외처리의 책임을 상위로 위임함
	public static void inputScore(int score) throws InvalidScoreException {

		if (score < 0 || score > 100) {
        	// 사용자정의 예외클래스로 예외 발생
			throw new InvalidScoreException("0 ~ 100사이의 정수만 입력하셈");
		}
	}

}

// Exception(상위 예외클래스)를 상속하는 사용자정의 예외클래스
class InvalidScoreException extends Exception {

	public InvalidScoreException(String message) {
		super(message);
		// TODO Auto-generated constructor stub
	}

}
728x90

이클립스에서 웹 프로젝트 시 Unable to compile class for JSP: 나

java.lang.ClassNotFoundException 오류가 뜰 때가 있다.

 

[해결법]

첫번째 방법

Project - Clean 

 

두번째 방법

Project - Properties - Java Build Path - Order and Export - JRE System Library 에 체크 후 Apply

 

세번째 방법

Project - Build Automatically 가 체크해제 되어있으면 체크

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

[JAVA] 예외처리와 사용자 정의 예외 클래스  (0) 2021.04.02
[JAVA] 추상(abstract)  (0) 2021.03.09
[JAVA] final 키워드 / 상수(constant)  (0) 2021.03.09
[JAVA] 다형성 / 다이나믹 바인딩  (0) 2021.03.08
JAVA - getter, setter  (0) 2021.02.09
728x90

추상(abstract)

추상(abstract)는 공통적인 특성을 정의하여 구체적인 부분은 자식클래스에서 정의하도록 하는 것이다.

이때 공통되는 특성을 가진 상위클래스를 추상 클래스, 이를 상속해 구체화하는 서브클래스는 실체화 클래스라고도 한다.

 

추상 클래스

추상 클래스는 new를 하지 못한다. (인스턴스 생성불가)

추상클래스는 멤버변수, 생성자, 일반메서드, 추상메서드를 가질 수 있다.

public class Ex3 {
	public static void main(String[] args) {
    	// Cannot instantiate the type AbstractClass
//		AbstractClass abstractClass = new AbstractClass();
	}
}

 

추상 메소드

서브클래스의 오버라이딩을 강제할 목적으로 정의하는 메서드로 외부에서 호출되지 않는다. 
모양은 동일하고 수행할 코드가 다른 메서드를 서브클래스에서 상속받아 오버라이딩하도록 강제성을 부여한다.

이전에 다형성에서 살펴봤지만 상속관계에서 오버라이딩이 기본적으로 강제되지는 못한다. 하지만 추상을 이용하면 이를 강제할 수 있는 것이다.

rutel.tistory.com/343

 

[JAVA] 다형성 / 다이나믹 바인딩

 [ 클래스의 관계 ]  1. Has-A 관계(포함 관계)  => A has a B = A 가 B 를 가지고 있다 = B가 A에 포함되어 있다.  => 일반적인 클래스의 관계이며, 특정 클래스 내에 다른 클래스를 포함시켜 사용하는 관

rutel.tistory.com

 

추상메소드는 아래와 같이 abstract 키워드를 사용하며 body (중괄호) 가 없이 세미콜론으로 선언한다.

[접근제한자] abstract 리턴타입 메서드명 ( [파라미터...] );

추상메소드는 반드시 추상 클래스 내에서만 정의 가능하다. 단, 모든 추상클래스가 추상메서드를 포함하는 것은 아니다

abstract class AbstractClass {
	public abstract void abstractMethod();
}

 

추상 클래스를 상속하는 클래스

추상클래스를 상속하는 클래스는 반드시 추상메소드를 재정의(override) 해 구현(implements)하거나

// The type SubClass must implement the inherited abstract method 
// AbstractClass.abstractMethod()
class SubClass extends AbstractClass { }	// error!

메소드 재정의(method override)하지 않을 경우 추상클래스로 선언해야 한다.

abstract class SubClass extends AbstractClass { }
728x90

final variable

 

값을 변경할 수 없으며 멤버변수에 초기화 값이 없을 시 (blank final), 생성자를 통해 초기화해야한다.

final 변수 이름은 모두 대문자를 쓰는 것이 기본 코딩스타일이다. (공백이나 단어구분시 언더스코어 _ 사용)

public class Ex {

	public static void main(String[] args) {
		FinalVariable f = new FinalVariable();
//		f.NUM1 = 10;
		f.num2 = 20;
		
		FinalVariable2 f2 = new FinalVariable2(100);
		FinalVariable2 f3 = new FinalVariable2(9098);
		
		System.out.println(f2.NUM1 + ", " + f2.NUM2);
		System.out.println(f3.NUM1 + ", " + f3.NUM2);
	}

}

class FinalVariable {
	final int NUM1 = 10;
	int num2 = 20;
	
	public void setNum() {
//		NUM1 = 99;
		num2 = 99;
	}
}

class FinalVariable2 {
	final int NUM1 = 30;
	final int NUM2;
	
	public FinalVariable2(int nUM2) {		
		NUM2 = nUM2;
	}
}

Output :

30, 100
30, 9098

 

 

final method

: 상속받은 메소드를 그대로 사용해야하며 오버라이딩이 금지된다

class FinalMethod {
	public void normalMethod() {
		
	}
	
	public final void finalMethod() {
		System.out.println("super class method");
	}
}

class SubFinalMethod extends FinalMethod {

	@Override
	public void normalMethod() { }	
	// Cannot override the final method from FinalMethod
//	public final void finalMethod() { }
}

 

final 클래스

: 클래스의 상속(is-a 관계)이 불가능하다.

final class FinalClass {

}

// The type subfinal cannot subclass the final class FinalClass
//class subfinal extends FinalClass {
//	
//}

: 대신 포함관계 (has-a)는 가능

final class FinalClass {
	public void method() {

	}
}

class SubFinalClass {
	FinalClass finalClass = new FinalClass();

	public void method() {
		finalClass.method();
	}
}

 

 

상수(Constant)

불변의 값. static final 키워드를 붙여서 표현
static 키워드에 의해 클래스명만으로 접근이 가능하며 모든 인스턴스가 하나의 값을 공유

class Car {
	private String company;    
	public static final String COMPANY_HYUNDAI = "HYUNDAI";
    
    public String getCompany() {
		return company;
	}
	public void setCompany(String company) {
		this.company = company;
	}
}

잘못된 값 입력확률을 줄이고 미리 정의된 값을 쉽게 가져다 쓸 수 있다.

public class Ex2 {
	public static void main(String[] args) {		
		Car car = new Car();		
		car.setCompany(Car.COMPANY_HYUNDAI);
		
		if(car.getCompany().equals(Car.COMPANY_HYUNDAI)) {
			System.out.println("현대자동차");
		} 
	}
}

상수는 생성자에서 초기화 될 수 없다. static은 인스턴스 생성전에 초기화되기 때문

728x90

 [ 클래스의 관계 ]

 1. Has-A 관계(포함 관계)
   => A has a B = A 가 B 를 가지고 있다 = B가 A에 포함되어 있다.
   => 일반적인 클래스의 관계이며, 특정 클래스 내에
        다른 클래스를 포함시켜 사용하는 관계
    ex) class A {
     B b = new B();
    }
2. Is-A 관계(상속 관계)
    => A is a B = A 는 B 이다 = A 는 B 를 상속받은 관계이다. (자신 포함)
    => 초등학생은 학생이다 = 초등학생 is a 학생(O)
       컴퓨터는 기계장치이다 = 컴퓨터 is a 머신(O)
       학생은 학생이다 = 학생 is a 학생(O)
    => 스파이더맨은 사람이다(O)
       사람은 스파이더맨이다(X)
    ex) class A extends B {}
  

 [ instanceof 연산자 ]

 - 좌변의 객체(참조변수)가 우변의 클래스 타입(상속관계)인지 판별하는 연산자
 - 주로 if문에 결합하여 판별하는데 사용되며
  판별 결과가 true 이면 형변환이 가능한 관계(업캐스팅 또는 다운캐스팅)
판별 결과가   false 이면 절대로 형변환 불가능
  
 < 기본 문법 >
 if(A instanceof B) {}
 => A는 참조변수(인스턴스), B는 클래스명

 

public class Ex {

	public static void main(String[] args) {		
		SmartPhone sp = new SmartPhone();
		// 참조변수 sp 로 접근 가능한 SmartPhone 객체의 메서드 : 3개
		sp.call();
		sp.sms();
		sp.kakaoTalk();
		
		if (sp instanceof SmartPhone) {
			System.out.println("sp is a smartphone");
		}
		
		System.out.println("=========================");
		
		if (sp instanceof HandPhone) {
			System.out.println("sp is a HandPhone");
			HandPhone hp = sp;
			hp.call();
			hp.sms();			
		}
		else {
			System.out.println("sp is not a HandPhone");
		}
		
		System.out.println("=========================");
		
		HandPhone hp = new HandPhone();
		hp.call();
		hp.sms();
		
		if (hp instanceof HandPhone) {
			System.out.println("hp is a HandPhone");			
			HandPhone handPhone = hp;
		}
		
		System.out.println("=========================");
		
		if (hp instanceof SmartPhone) {
			System.out.println("hp is a SmartPhone");
		}
		else {
			System.out.println("hp is not a SmartPhone");
//			SmartPhone sp2 = (SmartPhone)hp;
		}
		
		HandPhone hp2 = new SmartPhone();
		hp2.call();
		hp2.sms();
		
		if (hp2 instanceof HandPhone) {
			System.out.println("hp2 is HandPhone");			
		}
		if (hp2 instanceof SmartPhone) {
			System.out.println("hp2 is SmartPhone");
			
		    SmartPhone sp2 = (SmartPhone) hp2;
		    sp2.sms();
		    sp2.kakaoTalk();
		}
		else {
			System.out.println("hp2 is not a SmartPhone");
		}
		
		System.out.println("==========================");
		Child c = new Child();
		
//		Parent p = c;
//		p.parentPrn();
		
		if (c instanceof Parent) {
			System.out.println("c is a Parent");
			Parent p = c;
			p.parentPrn();
		}
		
		Parent p2 = new Parent();
		
		if (p2 instanceof Child) {
			System.out.println("p2 is a Child");
		} else {
			System.out.println("p2 is not a Child");
		}
	}

}

// HandPhone 과 Battery 의 관계는 has-a 관계이다.
class Battery {}

class HandPhone {
	Battery better = new Battery();
	
	public void call() {
		System.out.println("전화!");
	}
	
	public void sms() {
		System.out.println("문자!");
	}
}

// HandPhone 과 SmartPhone 의 관계는 상속관계이다.
class SmartPhone extends HandPhone {
	public void kakaoTalk() {
		System.out.println("카톡!");
	}
}

class Parent {
	public void parentPrn() {
		System.out.println("parentPrn");
	}
}

class Child extends Parent {
	public void childPrn() {
		System.out.println("childPrn");		
	}
}

 

 

상속관계의 오버라이딩

 - 슈퍼클래스의 메서드를 서브클래스에서 오버라이딩 하는 경우
   슈퍼클래스의 메서드는 은닉됨  
 

동적 바인딩 (Dynamic Binding)

 - 상속 관계에서 업캐스팅 후 상속된 메서드를 호출하여 실행할 때
   컴파일(번역) 시점에서의 실행 대상과 실제 실행 단계에서의 실행 대상이 달라지는 것(동적으로 변하는 것)
- 참조 변수의 데이터타입과 무관하게 실제 인스턴스에 따라 실행되는 메서드가 달라짐

public class Ex2 {

	public static void main(String[] args) {
		
		Parent2 p = new Parent2();
		p.parentPrn();
		
		p = new Child2(); // 업캐스팅
		// 참조변수 p 는 Parent2 클래스 타입의 변수이지만
		// 저장된 인스턴스 주소는 Child2 클래스 타입의 인스턴스이다.
		// 따라서, 참조변수 p 를 통해 접근하는 실제 인스턴스는 Child2 이므로
		// p.parentPrn() 메서드를 호출하면 실행되는 메서드도 Child2 의 메서드이다!
		p.parentPrn();
	}

}

class Parent2 {
	public void parentPrn() {
		System.out.println("슈퍼클래스의 parentPrn()");
	}
}

class Child2 extends Parent2 {	
	public void childPrn() {
		System.out.println("서브클래스의 childPrn()");
	}

	@Override
	public void parentPrn() {
		System.out.println("서브클래스에서 오버라이딩 된 parentPrn()");
	}	
}

 

다형성(Polymorphism)

- 하나의 참조변수로 여러 인스턴스를 참조하는 것
= 인스턴스를 다양한 형태로 변환하는 것
= 인스턴스를 업캐스팅하여 슈퍼클래스 타입으로 서브클래스의 멤버 접근

 

public class Ex3 {

	public static void main(String[] args) {
		Circle c = new Circle();
		c.circleDraw();
		
		Rectangle r = new Rectangle();
		r.paint();
		
		Triangle t = new Triangle();
		t.design();
		
		System.out.println("===================");
		c.draw();
		r.draw();
		t.draw();
		System.out.println("===================");
		
		Shape s;		
		s = c;
		s.draw();
		
		s = r;
		s.draw();
		
		s = t;
		s.draw();
	}

}

class Shape { // 도형 클래스
	// 공통적으로 도형을 그릴 수 있는 draw() 메서드 정의
	public void draw() {
		System.out.println("도형 그리기!");
	}
}

class Circle extends Shape {
	public void circleDraw() {
		System.out.println("원 그리기!");
	}

	@Override
	public void draw() {
		System.out.println("원 그리기!");
	}
	
}

class Rectangle extends Shape {
	public void paint() {
		System.out.println("사각형 그리기!");
	}
	
	@Override
	public void draw() {
		System.out.println("사각형 그리기!");
	}
}

class Triangle extends Shape {
	public void design() {
		System.out.println("삼각형 그리기!");
	}
	
	@Override
	public void draw() {
		System.out.println("삼각형 그리기!");
		
	}
}

Output : 

원 그리기!
사각형 그리기!
삼각형 그리기!
===================
원 그리기!
사각형 그리기!
삼각형 그리기!
===================
원 그리기!
사각형 그리기!
삼각형 그리기!

 

 

ex) 다형성은 아래와 같이 메소드의 파라미터를 통해서도 활용할 수 있다.

: 파라미터로 Circle, Rectangle, Triangle 인스턴스 전달 -> Shape 타입으로 업캐스팅됨

public class Ex3 {
	public static void main(String[] args) {		
		drawShape(new Circle());
//		drawShape(new Rectangle());  
		polymorphismDrawShape(new Circle());
		polymorphismDrawShape(new Rectangle());
		polymorphismDrawShape(new Triangle());
	}
	
	public static void drawShape(Circle c) {
		c.draw();
	}
	
	public static void polymorphismDrawShape(Shape s) {
		s.draw();
	}
}

class Shape { // 도형 클래스
	// 공통적으로 도형을 그릴 수 있는 draw() 메서드 정의
	public void draw() {
		System.out.println("도형 그리기!");
	}
}

class Circle extends Shape {
	@Override
	public void draw() {
		System.out.println("원 그리기!");
	}
	
}
(...)

ex) 다형성을 배열에 활용하는 경우 (업캐스팅)

	Circle[] cArr = new Circle[3];
		cArr[0] = new Circle();
//		cArr[1] = new Rectangle();
		
		Shape[] sArr = new Shape[3];
		sArr[0] = new Circle();
		sArr[1] = new Rectangle();
		sArr[2] = new Triangle();
		
		for (Shape shape : sArr) {
			shape.draw();
		}

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

[JAVA] 추상(abstract)  (0) 2021.03.09
[JAVA] final 키워드 / 상수(constant)  (0) 2021.03.09
JAVA - getter, setter  (0) 2021.02.09
JAVA - 파일 내 특정 문자열이 포함된 행을 제거  (0) 2021.02.04
JAVA에서의 데이터 타입  (0) 2021.01.11
728x90

boolean type의 get메소드는 관례적으로 is멤버변수이름 이 된다

예) 멤버변수 stop의 get 메소드는 isStop

 

이클립스IDE에서 자동완성기능 

클래스내에서 Alt + Shift + S 누른 후 

r눌러 만드려는 멤버변수나 옵션(코드삽입지점,정렬,접근 한정자,코멘트 생성 등) 선택 후 generate

 

퀵액세스 :

ctrl + 3 눌러 원하는 단축키 검색 - get, set검색후 선택해 엔터



728x90

사실 이건 자막 파일에서 시간정보만 빼고 추려내기 위해 만든 소스인데

containString을 수정해서 응용하기 나름일 듯 합니다

import java.util.List;
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

public class FileReadWrite {

	public static void main(String[] args) {
		
		String readPath = "C:\\Users\\rutel\\Downloads\\sub.vtt";
		String newPath = "C:\\Users\\rutel\\Downloads\\sub.txt";
		String containString = "-->";
		
		//파일 객체 생성
        Path path = Paths.get(readPath);
        // 캐릭터셋 지정
        Charset cs = StandardCharsets.UTF_8;
        //파일 내용담을 리스트
        List<String> list = new ArrayList<String>();
        // 새 파일 내용담을 리스트
        List<String> nlist = new ArrayList<String>();
        try{
            list = Files.readAllLines(path,cs);
        }catch(IOException e){
            e.printStackTrace();
        }
        for(String readLine : list){
            //System.out.println(readLine);
        	if (readLine.contains(containString)) {
        		continue;
        	}
        	else {
        		nlist.add(readLine);
        	}
        }
        // 새 파일 내용쓰기
        try{
            //파일 객체 생성        	
            File file = new File(newPath);
            BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(file));
            
            if(file.isFile() && file.canWrite()){
            	for(String readLine : nlist){
            		//쓰기
                    bufferedWriter.write(readLine);
                    //개행문자쓰기
                    bufferedWriter.newLine();
            	}
                
                bufferedWriter.close();
            }
        }catch (IOException e) {
            System.out.println(e);
        }
        
        System.out.println("작업 완료");
	}

}

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

[JAVA] 다형성 / 다이나믹 바인딩  (0) 2021.03.08
JAVA - getter, setter  (0) 2021.02.09
JAVA에서의 데이터 타입  (0) 2021.01.11
자바 - 식별자  (0) 2021.01.06
자바 NIO 셀렉터  (0) 2017.07.05

+ Recent posts