C나 C++에서 Orthogonality 이해를 못하겠네요...

kknd345의 이미지

C나 C++에서 Orthogonality 라고 하면 대표적인것으로

a= i++ + ++i;

가 있다고 하는데

영어단어의 Orthogonality 의 뜻은 "직교의" 이런건데...

여기서 의미하는 바를 모르겠습니다.

그리고 a= i++ + ++i; 이런 비슷한 예 알고계시면 가르쳐 주세요.

죠커의 이미지

저 코드는 틀린 코드이며 직교성과 상관없습니다. 애시당초 틀린 코드를 가지고 따져보는 일은 의미가 없다고 봅니다.

딱히 C/C++ 예제가 생각나지 않기 떄문에 실 예를 들어보겠습니다. 마우스를 왼쪽으로 움직이는 것이 커서를 위나 아래로 옮기지 않습니다. 그렇기 떄문에 우리는 수평으로 움직일 때 손의 좌, 우 움직임만 고려하면 됩니다. 이런 부분이 직교성이 보장되는 상황입니다.

직교성이 보장되지 않는 상황으로서는 배의 노를 들 수 있겠습니다. 양쪽에 노가 있는 배가 정확하게 앞으로 옮기기 위해서는 왼편의 노와 오른편의 노를 동시에 젓기도 해야하면 왼편의 노만 젓기도 하고 오른편의 노만 젓기도 해야 합니다.

- CN의 낙서장 / HanIRC:#CN

죠커의 이미지

실수로 중복투고하였습니다. 삭제부탁드립니다.

hayarobi의 이미지

엑... 댓글 편집 들어가면 삭제 있는 줄 알고 댓글 달았다가 저도 삭제 못하고 있습니다...;

---------- 시그 *****
저도 세벌식을 씁니다.
M$윈도우즈, 리눅스, 맥오에스텐, 맥오에스클래식을 모두 엔드유저 수준으로 쓴답니다.
http://psg9.egloos.com

=================
잠못자는 한솔아빠

jachin의 이미지

저같은 경우는 통신시스템에서 처음 접한 단어입니다. 주파수의 상관관계에서 두 신호간에 orthogonality 가 있다는 식의 말을 접했는데, 도무지 orthogonality 가 무엇으로 대변될 수 있는지 모르겠더군요. 한 3년 동안 의아해 하면서도 그 개념에 대해 무지했었는데, CN님의 말씀을 읽고보니 뭔가 감이 오는 것 같기도 하고...

제가 느꼈던 orthogonality 는 같은 성질을 갖고 있으면서 거울에 비친듯 반대되는 방향으로 진행하는 백터나 파형을 이르는 단어로 기억하고 있습니다. (대부분 복소수 단의 부호가 바뀌게 되지요...)

하지만 확실히 prefix operator 와 postfix operator 의 경우는 orthogonality 와 다른 의미인 것 같아요. ^^;
====
( - -)a 이제는 학생으로 가장한 백수가 아닌 진짜 백수가 되어야겠다.

seoleda의 이미지

orthogonality라고 하면 서로간의 간섭이나 방해가 없을 경우, orthogonal 이라고 하더군요.

수학적으로 얘기해보면, u_i *u_j = 0 (i!=j) 인 경우, Orthogonal 이라고 합니다. 물론, u_i*u_i = k 이고, 특별히 k=1 인 경우를 orthonormal 이라고 합니다.
예를 들면, { {1 1 -1 -1}, {1 1 1 1 }, { 1 - 1 1 - 1}, {1 -1, -1, 1} } 와 같은 4차원 벡터의 집합은 orthogonal 입니다.

어떤 녀석이 orthogonality라는 성질을 가지면, inverse를 아주 쉽게 구할 수 있기 때문에 예전에는 가능하지 않았던 여러가지를 할 수 있습니다. 자세한 내용은 선형대수를... ^^

ed.netdiver의 이미지

어서 주서들은 얘기를 하자면, 상호 의존성이 적으면 적을수록 직교성이 높다고 얘기하는 것으로 알고 있습니다.
수학을 예로 들면 간단한데, y=1이란 그래프를 그리면 x축에 평행하고 y절편이 1인 직선이 나오죠? 이 함수는 x축의 어떤 값에 대해서도 동일한 결과를 내며, 즉 x값에 독립적이란 뜻이 됩니다.
이경우를 오소고널하다고 하며, 상호 인접한(인접하지 않은, 즉 interaction이 없는 module간 비교는 무의미할테니...)두개의 software module이 각자의 기능구현에 있어 상대편에 영향을 미치지도 받지도 않는, 이른바 interface최적의 상태를 가장 orthogonal하다고 할수 있고, 반대로 가면...vice versa겠죵?^^;

아 어디선가 주서들은 잡다구리한 얘기들을 과연 난 제대로 알고 주절거리는걸깡^^;

\(´∇`)ノ \(´∇`)ノ \(´∇`)ノ \(´∇`)ノ
def ed():neTdiVeR in range(thEeArTh)

--------------------------------------------------------------------------------
\(´∇`)ノ \(´∇`)ノ \(´∇`)ノ \(´∇`)ノ
def ed():neTdiVeR in range(thEeArTh)

죠커의 이미지

대부분 훌륭한 함수, 라이브러리들은 직교성을 지키고 있습니다. Windows API도 비교적 괜찮은 편인데 비주얼 베이직을 위해 제공되는 컨트롤과 라이브러리들은 직교성이 보장되지 않아서 난감한 적이 종종 있습니다.

예를 들면 창의 x 좌표값을 바꾸는 메소드 setX가 있다고 한다면 이 함수가 y 좌표값을 바꾸지 않는 것이 올바른 설계입니다. 이건 너무 당연한 이야기입니다만 조금만 더 복잡해지면 지켜지지 않는 경우가 의외로 많습니다. 헬리콥터의 높이를 조작하기 위해서는 한번에 4개의 장치를 동시에 조작해야 한다고 합니다. 만약에 하나만 조작한다면 4개의 장비가 복합적으로 얽혀있기 때문에 높이만 조작되는 것이 아니라 좌우로 틀거나 동체가 빙글돌고 맙니다. 되도록이면 우리 프로그램은 헬리콥터와 같은 조작법을 가져게 않게 해야 할 것입니다.

- CN의 낙서장 / HanIRC:#CN

prolinko의 이미지

일반 적으로 generic programming을 사용하게 되면 OOP의 개념에 반하는 부분도 있지만 OOP만 사용할때에 한계가 있는 부분의 orthogonality를 높일 수 있습니다.

예를 들어 OOP를 이용하여서 5가지의 컨테이너 클래스에 10가지의 알고리즘을 구현 할려고 하면 각각의 컨테이너에 5*10 = 50개의 멤버변수로 알고리즘을 각각 구현해 줘야 합니다.(물론 상속을 이용해서 코드중복을 줄일 수 있습니다만 상속구조가 복잡해 지면 이것도 한계가 있습니다.) Java API들이(특히 generics 도입 이전) 이런 형식을 가지고 있기때문에 각 클래스 들이 수만은 멤버 함수들을 가지고 있죠.

STL에서는 container와 alogorithm사이에 iterator라는 통일된 인터페이스를 사용함으로서 container 구현시에 algorithm을 염두에 두지 않아도 되고 마찬가지로 algorithm 구현시에도 container의 종류를 생각하지 않아도 되는 orthogonality를 가지고 있습니다. 위에 예처럼 5개의 컨테이너와 이에 적용할 수 있는 10개의 알고리즘을 구현시에 iterator 인터페이스를 맞추기만 한다면 서로간에 코드를 참조가 없는 독립된 10 + 5 = 15 개의 클래스만 구현을 하면 됩니다.

두 백터 a, b가 서로 직교할 경우 서로 공통된 성분을 전혀 가지지 않게 되고 두백터의 내적이 a*b로 최대가 됩니다. (직교하지 않을 경우 a*b보다 작음)
마찬가지로 두개의 컴포넌트 A, B가 서로 코드상 독립성이 보장된다면(즉 직교한다면) 각각에 해당하는 구현을 a개 b개 해놓으면 추가적인 구현이 필요없이 곳바로 a*b개의 기능을 사용할 수 있게 되는 것입니다.

shyguy의 이미지

전체 의미에 별 영향을 끼치지는 않지만, 참고로 aㅗb하면 내적은 최소가 되고 면적이 최대가 됩니다.

silepu의 이미지

직교성 문제 입니다. 즉 +연산자 양변에서 어떤 연산이 일어나든 +연산자는 독립적으로 더합니다. 즉 i++을 먼저하고 ++i를 하고 i++ + ++i를 하던지 i++과 ++i를 동시에 하고 난 후 (이때 i는 i+1이 되겠죠) i++ + ++i를 하던지 +는 신경 안쓰지만 결과는 다릅니다.
(실제로 visual c++ 6.0에서 코딩하여 실행해 보면 i는 1 일때 i++ + ++i는 4가 출력되었습니다. 그러나 +연산자를 재정의하여 좌측부터 차례로 계산하게 하면 5가 나왔습니다.)
즉 이 한줄을 어떻게 처리하는지는 컴파일러 마다 다를 수 있습니다. 이게 orthogonality의 문제점입니다.
틀린 코드는 아닙니다, 그러나 쓰면 좋지 않는 코드입니다.
즉, 문장은 맞지만 의미는 어떻게 될 지 모르는 코드입니다.
비슷한 예로 if(x=y) 에서 문장은 맞지만 if(x==y)로 쓸 것을 잘못 입력하여 컴파일을 해도 syntax error는 아닙니다.
if()와 x=y는 서로 별개로 보기 때문에 둘 다 맞으면 어떻게 조합되든 상관없기 때문입니다.

익명사용자의 이미지

직교성을 이렇게 풀이하는 건 처음 봤군요.
정말 독창적입다.

sapsaldog의 이미지

질문자의 대답에 제일 맞는 답인것 같네요.

프로그래밍의 직교성이라 ㅎㅎ

아무튼 인간의 사고의 범위는 엄청난거 같습니다.

oosap의 이미지

재밌는 개념이네요...
이런 개념은 무슨 과목에서 가르치나요? 프로그램 언어론인가요?
전산과 출신이 아닌 사람인 저에게는 이런 개념 나올 때 마다 신기하기만 합니다.

구글에서 "C C++ Orthogonality" 를검색해보니 괜찮은 대학 학부 리포트도 보이는 군요.

극단적인 OOP 를 구현하기 거의 불가능하듯이
극단적인 Orthogonality 도 구현하기는 거의 불가능하고 실효성도 없다는 내용인 것 같습니다.
물론 OOP 를 최대한 추구하면 OOP 의 장점들을 최대한 구현할 수 있어서 좋듯이
Orthogonality 도 최대한 구현하면 역시 얻는 것이 있을 테지요.

하지만 현실은 완전히 무결하지 않듯이 언제나 어느정도에서 타협할 수 밖에 없겠죠...

Thanks for being one of those who care for people and mankind.
I'd like to be one of those as well.

oosap의 이미지

제가 질문자에게는 답변은 안하고 제 질문만 늘어놓았군요..

여기서 의미하는 바를 모르겠습니다.
>> 위에 계신 분들 설명이 적절한 것 같아요. 제가 잠시 구글링해본 내용에 비춰보니까요..

그리고 a= i++ + ++i; 이런 비슷한 예 알고계시면 가르쳐 주세요.
>> 구글에서 "C C++ Orthogonality" 를검색해보니 괜찮은 대학 학부 리포트도 보이는 군요. 제가 파일 첨부를 할 수 없는 것은 해당 리포트에 작성자의 정보가 포함되 있고 저작권도 모르기에 검색 해보시라는 힌트만 드립니다.

Thanks for being one of those who care for people and mankind.
I'd like to be one of those as well.

oosap의 이미지

UML Distilled 라는 책을 보던 중 Orthogonal State 라는 개념이 나와서 여기 올려봅니다.
UML 2 의 상태 다이어그램을 그릴 때 동시에 두가지 이상의 독립적인 상태가 그려질 수 있고 그런 경우 첨부파일처럼 그린다고 합니다. 여기서의 직교성 역시 서로 무관한 성질을 갖습니다. 동시에 진행되는 상태이지만 서로 아무런 관련이 없는 것... 전산에서는 그런 의미인가봅니다.

댓글 첨부 파일: 
첨부파일 크기
Image icon orthogonalstate.jpg59.48 KB

Thanks for being one of those who care for people and mankind.
I'd like to be one of those as well.

익명 사용자의 이미지


저는 물리학과 출신 인데, 양자역학 배울때 Orthogonality 라는 말을 처음 들었죠

양자역학 시간, 수학 문제 풀때 행렬문제를 많이 푸는데,

행렬문제를 풀려면, 방정식 문제 풀듯이 x, y 축 좌표 에 해당하는 행렬을 구해야 합니다.

여기서 x, y 축에 해당하는 행렬을 구할때 직교성이라는 말이 나오죠. 즉 서로 영향을 주지 않는 연산정도..

중고등학교 때는 당연한 거니까, 이 말이 없다가, 막상 x, y 축의 속성에 해당하는 말을 찾다보니 나온거 같읍니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.